【问题标题】:indexing multi-level index dataframe索引多级索引数据框
【发布时间】:2018-08-05 03:56:29
【问题描述】:
mydf = pd.DataFrame({'dts':['1/1/2000','1/1/2000','1/1/2000','1/2/2000', '1/3/2000', '1/3/2000'],
                            'product':['A', 'B', 'A','A', 'A','B'],
                            'value':[1,2,2,3,6,1]})
a =mydf.groupby(['dts','product']).sum()
a
Out[1]: 
                  value
dts      product       
1/1/2000 A            3
         B            2
1/2/2000 A            3
1/3/2000 A            6
         B            1

a.loc[('1/1/2000','A'),] 给出第一行。

  a.loc[('1/1/2000','A'),]
    Out[2]: 
    value    3
    Name: (1/1/2000, A), dtype: int64

但是为什么a.loc[['1/1/2000','A'],] 也给 B 的第二行?唯一的区别是括号

a.loc[['1/1/2000','A'],]
Out[3]: 
                  value
dts      product       
1/1/2000 A            3
         B            2

【问题讨论】:

    标签: python dataframe multi-index


    【解决方案1】:

    用完全不同的东西替换“A”:

    a.loc[['1/1/2000','XYZZZ'],]
    
                      value
    dts      product       
    1/1/2000 A            3
             B            2
    

    现在,用元组重复这个:

    a.loc[('1/1/2000','XYZZZ'),]
    

    这就是你得到的:

    KeyError: ('1/1/2000', 'XYZZZ')
    

    当指定为列表时,pandas 将尝试仅在第一级建立索引。 “1/1/2000”出现在第一级,并返回与其关联的所有记录。

    当指定为元组时,它假定所有级别的元组值,当它没有找到它时,会引发 KeyError。当它找到它时,只会返回该行。

    【讨论】:

    • 我不认为这种行为应该是故意的。
    • 我猜原因是元组是可散列的,因此很容易比较。列表不是,这会强制引发错误(鉴于 pandas 切片中的所有内容都使用 [ ],这将是违反直觉的)或遍历列表。也许使用第一个元素是优先考虑性能的解决方案
    猜你喜欢
    • 2018-10-24
    • 2023-03-23
    • 2020-10-22
    • 1970-01-01
    • 2020-04-16
    • 2013-12-04
    • 2018-04-20
    • 2018-08-24
    相关资源
    最近更新 更多