相关疑难解决方法(0)

从多指数熊猫中选择

我有一个带有"A"和"B"列的多索引数据框.

是否有一种方法可以通过过滤多索引的一列来选择行,而无需将索引重置为单列索引.

例如.

# has multi-index (A,B)
df
#can I do this? I know this doesn't work because the index is multi-index so I need to     specify a tuple

df.ix[df.A ==1]
Run Code Online (Sandbox Code Playgroud)

python multi-index dataframe pandas

77
推荐指数
7
解决办法
9万
查看次数

如何查询pandas中的MultiIndex索引列值

代码示例:

In [171]: A = np.array([1.1, 1.1, 3.3, 3.3, 5.5, 6.6])

In [172]: B = np.array([111, 222, 222, 333, 333, 777])

In [173]: C = randint(10, 99, 6)

In [174]: df = pd.DataFrame(zip(A, B, C), columns=['A', 'B', 'C'])

In [175]: df.set_index(['A', 'B'], inplace=True)

In [176]: df
Out[176]: 
          C
A   B      
1.1 111  20
    222  31
3.3 222  24
    333  65
5.5 333  22
6.6 777  74 
Run Code Online (Sandbox Code Playgroud)

现在,我想要检索A值:
Q1:在范围[3.3,6.6]中 - 预期返回值:[3.3,5.5,6.6]或[3.3,3.3,5.5,6.6],如果是最后一个,则[3.3,5.5 ]或[3.3,3.3,5.5],如果没有.
Q2:在[2.0,4.0]范围内 - 预期回报值:[3.3]或[3.3,3.3]

对于任何其他MultiIndex维度也是如此,例如B值:
Q3 …

python indexing slice multi-index pandas

56
推荐指数
3
解决办法
8万
查看次数

使用pd.eval()在pandas中进行动态表达式评估

目标和动机

pd.eval并且eval是pandas API套件中功能强大但被低估的功能,它们的使用远未完全记录或理解.小心适量,eval并且engine可以极大地简化代码,提高性能,并成为创建动态工作流的强大工具.

这个规范QnA的目的是让用户更好地理解这些功能,讨论一些鲜为人知的功能,如何使用它们,以及如何最好地使用它们,以及清晰易懂的示例.这篇文章将讨论的两个主要议题是

  1. 了解parser,df2x在争论pd.eval,以及它们如何被用来计算表达式
  2. 了解之间的差eval,eval并且engine,当每个功能是合适的用于动态执行.

这篇文章不能替代文档(答案中的链接),所以请完成它!


我将以这样的方式构建一个问题,以便开启对所支持的各种功能的讨论parser.

给出两个DataFrame

np.random.seed(0)
df1 = pd.DataFrame(np.random.choice(10, (5, 4)), columns=list('ABCD'))
df2 = pd.DataFrame(np.random.choice(10, (5, 4)), columns=list('ABCD'))

df1
   A  B  C  D
0  5  0  3  3
1  7  9  3  5
2  2  4  7  6
3  8  8  1  6
4  7  7  8  1

df2
   A  B  C …
Run Code Online (Sandbox Code Playgroud)

python eval dataframe pandas

45
推荐指数
2
解决办法
7156
查看次数

过滤多索引Python Panda数据帧中的多个项目

我有下表:

注意:NSRCODE和PBL_AWI都是索引

注意:%of area列将被填写,但尚未完成.

NSRCODE  PBL_AWI          Area           % Of Area
CM       BONS             44705.492941
         BTNN            253854.591990
         FONG             41625.590370
         FONS             16814.159680
         Lake             57124.819333
         River             1603.906642
         SONS            583958.444751
         STNN             45603.837177
         clearcut        106139.013930
         disturbed       127719.865675
         lowland         118795.578059
         upland         2701289.270193
LBH      BFNN            289207.169650
         BONS           9140084.716743
         BTNI             33713.160390
         BTNN          19748004.789040
         FONG           1687122.469691
         FONS           5169959.591270
         FTNI            317251.976160
         FTNN           6536472.869395
         Lake            258046.508310
         River            44262.807900
         SONS           4379097.677405
         burn regen      744773.210860
         clearcut         54066.756790
         disturbed       597561.471686
         lowland       12591619.141842
         upland        23843453.638117
Run Code Online (Sandbox Code Playgroud)

如何过滤掉"PBL_AWI"索引中的项目?例如,我想保留['Lake','River','Upland']

python indexing filter pandas

30
推荐指数
5
解决办法
2万
查看次数

pandas multiindex - 如何在使用列时选择第二级?

愚蠢的问题,但我真的找不到答案.我有一个包含此索引的数据框:

index = pd.MultiIndex.from_product([['stock1','stock2'...],['price','volume'...]])
Run Code Online (Sandbox Code Playgroud)

这是一个有用的结构df['stock1'],但我如何选择所有价格数据?我无法理解文档.

我试过以下没有运气: df[:,'price'] df[:]['price'] df.loc(axis=1)[:,'close'] df['price]

如果无论出于何种原因,这种索引风格一般都被认为是一个坏主意,那么什么是更好的选择呢?我应该将股票的多指数指数作为时间序列上的标签而不是列级别吗?

非常感谢

编辑 - 我使用multiindex作为列,而不是索引(措辞对我来说更好).文档中的示例侧重于多级索引而不是列结构.

python-3.x pandas

30
推荐指数
4
解决办法
2万
查看次数

pandas:按二级索引的范围切片MultiIndex

我有一个像这样的MultiIndex系列:

import numpy as np
import pandas as pd

buckets = np.repeat(['a','b','c'], [3,5,1])
sequence = [0,1,5,0,1,2,4,50,0]

s = pd.Series(
    np.random.randn(len(sequence)), 
    index=pd.MultiIndex.from_tuples(zip(buckets, sequence))
)

# In [6]: s
# Out[6]: 
# a  0    -1.106047
#    1     1.665214
#    5     0.279190
# b  0     0.326364
#    1     0.900439
#    2    -0.653940
#    4     0.082270
#    50   -0.255482
# c  0    -0.091730
Run Code Online (Sandbox Code Playgroud)

我想得到s ['b']值,其中第二个索引(' sequence')在2到10之间.

在第一个索引上切片工作正常:

s['a':'b']
# Out[109]: 
# bucket  value
# a       0        1.828176
#         1        0.160496
#         5        0.401985 …
Run Code Online (Sandbox Code Playgroud)

python pandas

24
推荐指数
3
解决办法
3万
查看次数

基于MultiIndex的pandas索引

如果我定义一个像这样的分层索引数据帧:

import itertools
import pandas as pd
import numpy as np
a = ('A', 'B')
i = (0, 1, 2)
b = (True, False)
idx = pd.MultiIndex.from_tuples(list(itertools.product(a, i, b)),
                                names=('Alpha', 'Int', 'Bool'))
df = pd.DataFrame(np.random.randn(len(idx), 7), index=idx,
                  columns=('I', 'II', 'III', 'IV', 'V', 'VI', 'VII'))
Run Code Online (Sandbox Code Playgroud)

内容看起来像这样:

In [19]: df
Out[19]: 
                        I        II       III        IV         V        VI       VII
Alpha Int Bool                                                                       
A     0   True  -0.462924  1.210442  0.306737  0.325116 -1.320084 -0.831699  0.892865
          False -0.850570 -0.949779  0.022074 -0.205575 -0.684794 -0.214307 -1.133833
      1   True   0.603602 …
Run Code Online (Sandbox Code Playgroud)

pandas

24
推荐指数
1
解决办法
1万
查看次数

从pandas MultiIndex中选择列

我有DataFrame和MultiIndex列,如下所示:

# sample data
col = pd.MultiIndex.from_arrays([['one', 'one', 'one', 'two', 'two', 'two'],
                                ['a', 'b', 'c', 'a', 'b', 'c']])
data = pd.DataFrame(np.random.randn(4, 6), columns=col)
data
Run Code Online (Sandbox Code Playgroud)

样本数据

['a', 'c']从第二级别仅选择特定列(例如,不是范围)的正确,简单方法是什么?

目前我这样做:

import itertools
tuples = [i for i in itertools.product(['one', 'two'], ['a', 'c'])]
new_index = pd.MultiIndex.from_tuples(tuples)
print(new_index)
data.reindex_axis(new_index, axis=1)
Run Code Online (Sandbox Code Playgroud)

预期结果

然而,它不是一个好的解决方案,因为我必须淘汰itertools,手工构建另一个MultiIndex,然后重新索引(我的实际代码甚至更麻烦,因为列列表不是那么容易获取).我很确定必须有一些ixxs这样做,但我尝试的一切都导致了错误.

python hierarchical multi-index pandas

19
推荐指数
6
解决办法
1万
查看次数

如何更新MultiIndexed pandas DataFrame的子集

我正在使用MultiIndexed pandas DataFrame,并希望将DataFrame的子集乘以一定数量.

它与相同,但具有MultiIndex.

>>> d = pd.DataFrame({'year':[2008,2008,2008,2008,2009,2009,2009,2009], 
                      'flavour':['strawberry','strawberry','banana','banana',
                      'strawberry','strawberry','banana','banana'],
                      'day':['sat','sun','sat','sun','sat','sun','sat','sun'],
                      'sales':[10,12,22,23,11,13,23,24]})

>>> d = d.set_index(['year','flavour','day'])                  

>>> d
                     sales
year flavour    day       
2008 strawberry sat     10
                sun     12
     banana     sat     22
                sun     23
2009 strawberry sat     11
                sun     13
     banana     sat     23
                sun     24
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.但是,让我说我发现星期六的数字只是他们应该的一半!我想将所有sat销售额乘以2.

我的第一次尝试是:

sat = d.xs('sat', level='day')
sat = sat * 2
d.update(sat)
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为变量sat已经失去day了索引的级别:

>>> sat
                 sales
year flavour          
2008 strawberry     20
     banana         44
2009 strawberry     22
     banana         46 …
Run Code Online (Sandbox Code Playgroud)

python pandas

11
推荐指数
2
解决办法
3519
查看次数

通过MultiIndex级别或子级切片pandas DataFrame

受到这个答案的启发以及对这个问题缺乏简单的回答,我发现自己写了一些语法糖,让生活更容易通过MultiIndex级别进行过滤.

def _filter_series(x, level_name, filter_by):
    """
    Filter a pd.Series or pd.DataFrame x by `filter_by` on the MultiIndex level
    `level_name`

    Uses `pd.Index.get_level_values()` in the background. `filter_by` is either
    a string or an iterable.
    """
    if isinstance(x, pd.Series) or isinstance(x, pd.DataFrame):
        if type(filter_by) is str:
            filter_by = [filter_by]

        index = x.index.get_level_values(level_name).isin(filter_by)
        return x[index]
    else:
        print "Not a pandas object"
Run Code Online (Sandbox Code Playgroud)

但是,如果我知道熊猫开发团队(我开始,慢慢地!)已经有一个很好的方法来做到这一点,我只是不知道它是什么!

我对吗?

python pandas

11
推荐指数
3
解决办法
1万
查看次数