【问题标题】:pandas IndexSlice does not accept integer listpandas IndexSlice 不接受整数列表
【发布时间】:2018-03-17 21:43:04
【问题描述】:

使用 pandas IndexSlice,是否可以使用整数列表?当我使用整数列表时出现 KeyError: 'the label [xxxx] is not in the [columns]'(即使 multiIndex 级别中的值被格式化为字符串):

vals = np.random.randn(4)
df = pd.DataFrame({'l1': ['A', 'B', 'C', 'B'], 'l2': ['9876', '6789', '5432',
    '1234'], 'l3': ['Y', 'X', 'Y', 'Y'], 'value': vals})
df.set_index(['l1', 'l2', 'l3'], inplace=True)

idx = pd.IndexSlice

# None of the following works
df.loc[idx[:, 6789, :]]
df.loc[idx[:, [6789, 1234], :]]

df.reset_index(inplace=True)
df.l2 = df.l2.astype('str')
df.set_index(['l1', 'l2', 'l3'], inplace=True)
df.loc[idx[:, '6789', :]]

【问题讨论】:

    标签: python pandas dataframe indexing


    【解决方案1】:

    对于初学者,您的索引列是由字符串组成的,这是不可能的。

    要切出单个值,请使用惯用的xs

    df.xs('6789', level='l2')
    
              value
    l1 l3          
    B  X  -1.955361
    

    对于值列表,将axis 参数指定为loc

    df.loc(axis=0)[idx[:, ['6789', '1234'], :]]
    
                   value
    l1 l2   l3          
    B  6789 X  -1.955361
       1234 Y   0.703208
    

    请注意,对于标量,这也与 xs 相同;

    df.loc(axis=0)[idx[:, '6789', :]]
    
                   value
    l1 l2   l3          
    B  6789 X  -1.955361
    

    【讨论】:

    • your index columns are made up of strings - 非常好! :-)
    • @MaxU 一定是我今天做的咖啡,对我保持清醒很有帮助:P
    • 在上面编辑到我原来​​的整数列表,因为这也给了我一个错误。在loc 之后添加(axis=0) 是关键教训,除了索引级别和切片器中值的dtype 之间的一致性。
    • @A.Slowey 没问题。但出于本问答的目的,最好保持原样(否则您的编辑将使 MaxU 的答案无效):)
    • @coldspeed 这完全公平;您和 MaxU 的答案提供了两种选择,我之前的评论强调了最重要的部分,以便其他人了解处理任何一种情况所需知道的一切。但是,我很好奇 (axis=0) 和在完整的 idx 表达式之后附加 : 是如何实现相同的效果的
    【解决方案2】:

    备选方案:

    In [76]: df.loc[pd.IndexSlice[:, '6789', :], :]
    Out[76]:
                   value
    l1 l2   l3
    B  6789 X   1.306962
    

    PS 注意字符串值'6789' 和最后一个:

    df.loc[pd.IndexSlice[...], :] 
    #  NOTE:     ---->         ^
    

    【讨论】:

      猜你喜欢
      • 2011-07-31
      • 1970-01-01
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      • 2017-03-08
      • 1970-01-01
      • 2017-09-20
      • 2016-06-25
      相关资源
      最近更新 更多