【问题标题】:Pandas dataframe multi-index indexingPandas 数据框多索引索引
【发布时间】:2020-10-22 09:58:28
【问题描述】:

我有一个这样的数据框:

           d
a  b  c     
a1 b1 c1  10
   b2 c2  11
a2 b3 c3  12
   b4 c4   1
a3 b5 c5   2

abcmulti_index 列,我试图根据一个或多个索引列的值引用一些行。如何使用这些索引列的某种组合来过滤行?我尝试使用.loc,但没有得到我想要的结果:

理想的情况是传递一个包含我想要的索引值的列表,这样我就可以动态地传递我想要的参数。但在下面的示例中,它不起作用。

>>> x.loc[['a1', 'b1', 'c1']]
           d
a  b  c     
a1 b1 c1  10
   b2 c2  11

我发现这行得通:

>>> x.loc['a1', 'b1', 'c1']
d    10

但是x.loc['a1', 'c1'] 返回错误。

毕竟,.loc 在处理 multi-index 值时是如何工作的?我没有找到其他问题回答这个问题(可能是因为我使用了错误的关键字,我不知道......)。

我的最终目标是使用多索引的列(有时不是所有列)的值并获取对应的行。

【问题讨论】:

  • 要使您的第三个示例正常工作,您可以使用x.loc['a1', :, 'c1']。 Pandas 无法猜测您要索引的级别,它使用基于位置的查找
  • x.loc[['a1','lalalala','a2']],会查找第一级多索引匹配~
  • 谢谢!我现在明白了

标签: python pandas multi-index


【解决方案1】:

根据您使用的 pandas 版本,结果也可能不同。 查看您的示例,由于您的数据框只有一列,请注意它在某些时候不会转换为系列。

# Code to illustrate pandas upgrade:
import pandas as pd
cats = ['A', 'B']
groups = ['x','y','z']
idx = pd.MultiIndex.from_product((cats,groups))
df = pd.DataFrame(data=range(6), index=idx)  # Dataframe
ser = pd.Series(data=range(6), index=idx)  # Series

df.loc[pd.IndexSlice['A','y':],:] # This works for both pandas
ser.loc[pd.IndexSlice['A','y':],:] # This only works in older pandas
ser.loc[pd.IndexSlice['A','y':]] # This works in new pandas and old pandas`

pandas 1.2.x 抛出的错误是:

TypeError: unhashable type: 'slice'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-28
    • 2017-08-19
    • 1970-01-01
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    相关资源
    最近更新 更多