【问题标题】:Python Pandas Accessing values from second index in multi-indexed dataframePython Pandas从多索引数据框中的第二个索引访问值
【发布时间】:2013-05-20 15:00:57
【问题描述】:

我不确定多索引是如何工作的,所以我可能只是在这里尝试做错事。如果我有一个带有

的数据框
        Value
A  B         
1  1    5.67
1  2    6.87
1  3    7.23
2  1    8.67
2  2    9.87
2  3    10.23

如果我想访问 B=2 的元素,我该怎么做? df.ix[2] 给了我 A=2。要获得一个特定的值,它似乎是 df.ix[(1,2)] 但如果你不能直接访问它,这就是 B 索引的目的?

【问题讨论】:

    标签: python pandas multi-index


    【解决方案1】:

    如果您只想返回横截面,请使用xs(如@Andy Hayden 所述)。

    但是,如果您想覆盖原始数据框中的某些值,请改用pd.IndexSlice(与pd.loc)。给定一个数据框df

    In [73]: df
    Out[73]:
                     col_1  col_2
    index_1 index_2
    1       1            5      6
            1            5      6
            2            5      6
    2       2            5      6
    

    如果你想用0 覆盖col_1 中的所有元素,其中index_2 == 2 这样做:

    In [75]: df.loc[pd.IndexSlice[:, 2], 'col_1'] = 0
    
    In [76]: df
    Out[76]:
                     col_1  col_2
    index_1 index_2
    1       1            5      6
            1            5      6
            2            0      6
    2       2            0      6
    

    【讨论】:

      【解决方案2】:

      作为替代方案,您可以使用df.loc

      >>> df.loc[(slice(None),2),:]
           Value
      A B       
      1 2   6.87
      2 2   9.87
      

      元组按顺序访问索引。因此,slice(None) 从索引'A' 中获取所有值,第二位置限制基于第二级索引,在此示例中为'B'=2: 指定您想要所有列,但您也可以对那里的列进行子集。

      【讨论】:

      • 您甚至可以使用索引列表,例如df.loc[(slice(None),[2, 3]),:]
      【解决方案3】:

      你可以使用xs:

      In [11]: df.xs(2, level='B')
      Out[11]:
         Value
      A
      1   6.87
      2   9.87
      

      或者:

      In [12]: df1.xs(1, level=1)
      Out[12]:
         Value
      A
      1   5.67
      2   8.67
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-27
        • 2020-10-22
        • 2019-01-07
        • 2016-09-28
        • 2015-06-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多