在Pandas中使用.loc和MultiIndex

zi8p0yeb  于 2023-02-17  发布在  其他
关注(0)|答案(5)|浏览(174)

有人知道是否可以使用DataFrame.loc方法从MultiIndex中进行选择吗?我有以下DataFrame,希望能够访问位于Dwell列中的值,索引为('at', 1)('at', 3)('at', 5)等(非顺序)。
我希望能够做一些类似data.loc[['at',[1,3,5]], 'Dwell']的事情,类似于常规索引的data.loc[[1,3,5], 'Dwell']语法(返回Dwell值的3个成员序列)。
我的目的是选择数据的任意子集,仅对该子集执行一些分析,然后使用分析结果更新新值,我计划使用相同的语法为这些数据设置新值,因此链接选择器在这种情况下实际上不起作用。
下面是我正在使用的DataFrame的一部分:

Char    Dwell  Flight  ND_Offset  Offset
QGram                                                           
at    0     a      100     120   0.000000       0  
      1     t      180       0   0.108363       5  
      2     a      100     120   0.000000       0 
      3     t      180       0   0.108363       5 
      4     a       20     180   0.000000       0  
      5     t       80     120   0.108363       5
      6     a       20     180   0.000000       0   
      7     t       80     120   0.108363       5  
      8     a       20     180   0.000000       0  
      9     t       80     120   0.108363       5   
      10    a      120     180   0.000000       0
7vhp5slm

7vhp5slm1#

如果您使用的是0.14版本,您可以简单地将一个元组传递给.loc,如下所示:

df.loc[('at', [1,3,4]), 'Dwell']
cx6n0qe3

cx6n0qe32#

尝试横截面索引:

In [68]: df.xs('at', level='QGram', drop_level=False).loc[[1,4]]
Out[68]: 
        Char  Dwell  Flight  ND_Offset  Offset
QGram                                         
at    1    t    180       0   0.108363       5
      4    a     20     180   0.000000       0
qltillow

qltillow3#

通常,MultiIndex键采用元组的形式。例如:

In [6]: df.loc[('at', 1),'Dwell']
Out[6]: 180

在您的示例中,您必须传递一个元组的列表。例如,下面的代码可以正常工作:

In [7]: df.loc[ [('at', 1),('at', 3),('at', 5)], 'Dwell']
Out[7]:
          Dwell
QGram                                                           
at    1    180
at    3    180 
at    5     80
ldioqlga

ldioqlga4#

.loc是多索引最好的朋友。但是,您必须了解loc在多索引上的工作方式。在多索引上使用loc时,必须在loc中指定每隔一个索引值,例如:

df.loc['indexValue1','indexValue2','indexValue3']

然而,正如您可能想象的那样,在您不知道所有其他值是什么的情况下,这可能会很痛苦,因此我们当然可以使用':'

df.loc[:,'value1','value2',:]

希望这有帮助!

yb3bgrhw

yb3bgrhw5#

我也遇到过同样的问题。
df [(列索引1,列索引2)][(列索引1,列索引2,列索引3)]:没问题
定义函数位置[("列索引1","列索引2","列索引3")],[("列索引1","列索引2")]:显示以下错误消息:键错误:"[索引]中没有任何[索引(['rowindex1','rowindex2',\n 'rowindex3'],\n数据类型='对象')]"
我试过把我的索引tupke放在一个列表里面,结果是可以的:

df.loc[[('rowindex1','rowindex2', 'rowindex3')],[('colindex1','colindex2')]]

我不知道为什么,也许是因为索引中添加了一些未显示的"\n"?

相关问题