【问题标题】:pandas subtract on multiindex level matchingpandas 在多索引级别匹配上减去
【发布时间】:2018-09-11 10:15:14
【问题描述】:

我有一个带有两个多索引级别的 pandas 数据框

df
Out[202]: 
                     A         B         C         D
first second                                        
1     1      -0.080810  0.865259 -0.371148  0.346480
      2      -0.026636  1.259460 -1.109295 -0.871204
      3       0.372008 -1.778272  0.727838  0.620727
      4       0.918075  0.564741  2.027432 -1.614162
      5      -0.373527 -0.186027  0.225399  0.722733
2     1       0.344241  0.170596 -0.050763  2.692102
      2      -1.665413  0.357033 -0.691327 -0.983103
      3       1.277470 -1.841702  0.582107 -0.454315
      4       2.374108 -0.557879  0.797296  0.803622
      5      -1.001092  0.131217  0.131378 -0.636299  

我还有第二个数据帧,由原始数据帧中的两行组成,对应于多索引级别'second == 1'

to_subtract = df.query('second == 1')  
to_subtract
Out[200]: 
                     A         B         C         D
first second                                        
1     1      -0.080810  0.865259 -0.371148  0.346480
2     1       0.344241  0.170596 -0.050763  2.692102

我想在第一级用“to_subtract”减去“df”,但对于与多索引第一级对应的所有值。 Pandas 知道如何根据匹配多索引的所有级别进行减法,如下所示

df.sub(to_subtract)
Out[201]: 
                A    B    C    D
first second                    
1     1       0.0  0.0  0.0  0.0
      2       NaN  NaN  NaN  NaN
      3       NaN  NaN  NaN  NaN
      4       NaN  NaN  NaN  NaN
      5       NaN  NaN  NaN  NaN
2     1       0.0  0.0  0.0  0.0
      2       NaN  NaN  NaN  NaN
      3       NaN  NaN  NaN  NaN
      4       NaN  NaN  NaN  NaN
      5       NaN  NaN  NaN  NaN

问题是,如何通过 to_subtract[first==1] 减去 df[first===1] 中的所有值,以及通过 to_subtract[first==2] 减去 df[first==2] 中的所有值。我假设我可以做一个 for 循环并遍历所有内容,但如果可以的话,我宁愿避免这样做,因为这些数据帧将来可能会变得很大。

提前致谢

【问题讨论】:

    标签: python pandas multi-index subtraction


    【解决方案1】:

    我认为需要删除MultiIndex 的第二级,然后添加参数level=0 以在DataFrame.sub 中按第一级对齐:

    to_subtract = df.query('second == 1').reset_index(level=1, drop=True)
    #same as
    #to_subtract = df.xs(1, level=1)
    print (to_subtract)
                  A         B         C         D
    first                                        
    1     -0.080810  0.865259 -0.371148  0.346480
    2      0.344241  0.170596 -0.050763  2.692102
    
    df1 = df.sub(to_subtract, level=0)
    print (df1)
                         A         B         C         D
    first second                                        
    1     1       0.000000  0.000000  0.000000  0.000000
          2       0.054174  0.394201 -0.738147 -1.217684
          3       0.452818 -2.643531  1.098986  0.274247
          4       0.998885 -0.300518  2.398580 -1.960642
          5      -0.292717 -1.051286  0.596547  0.376253
    2     1       0.000000  0.000000  0.000000  0.000000
          2      -2.009654  0.186437 -0.640564 -3.675205
          3       0.933229 -2.012298  0.632870 -3.146417
          4       2.029867 -0.728475  0.848059 -1.888480
          5      -1.345333 -0.039379  0.182141 -3.328401
    

    【讨论】:

    • 是的!这行得通,感谢您的帮助。作为旁注,我注意到通过执行此操作,“to_subtract”会丢失其多索引级别之一。出于好奇,有没有办法做到这一点而不会发生“to_subtract”?
    • @MattP。 - 在我看来不是,需要删除它。
    • @MattP。如果不删除它,Multiindex 是对齐的,这意味着只减去带有second==1 的行。但是如果只需要通过第一级对齐,第二级是不必要的,需要删除它。如果我的回答有帮助,请不要忘记 accept 它 - 单击答案旁边的复选标记,将其从灰色切换为已填充。谢谢。
    猜你喜欢
    • 2018-12-16
    • 2016-02-21
    • 2018-07-09
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 2021-10-20
    • 2018-05-20
    • 2016-12-27
    相关资源
    最近更新 更多