Pandas 计算两个具有列和多索引的 DataFrame 的差异

Pandas calculate difference on two DataFrames with column and multi-indices

我有 2 个 DataFrame,df1 是:

         Jan17  Jun18  Dec18  Apr19
ID Name                            
0  Nick   10.0    1.7    3.7    0.0
1  Jack   10.0    0.0    2.8    3.5
2  Fox    10.0    1.7    0.0    0.0
3  Rex     1.0    0.0    3.0    4.2

第二个 DataFrame - df2 是:

          Jan17  Jun18  Dec18  Apr19
ID Name                             
0  Nick     5.0    1.7    2.0    0.0
1  Jack     6.0    0.0    0.8    3.5
2  Fox      8.0    5.0    0.0    0.0
3  Rex      1.0    0.0    1.0    4.2
4  Snack    3.1    9.0    2.8    4.4
5  Yosee    4.3    0.0    0.0    4.3
6  Petty    0.5    1.3    2.8    3.5
7  Lind     3.6    7.5    2.8    4.3
8  Korr     0.6    1.5    1.8    2.3

结果是df3:

ID   Name        Jan17  Jun18    Dec18    Apr19  
 0   Nick         5.0      0      1.7      0    
 1   Jack         4.0      0      2.0      0              
 2   Fox          2.0      -3.3   0        0    
 3   Rex          0        0      2.0      0  

如何根据多指标计算df1df2中的列之间的差异:df1[ID, Name]并将结果保存到df3

如有任何想法,我将不胜感激。谢谢!

就做减法,减法是在索引上对齐的。您可以在减去之前重新索引 df2 以避免 NaN:

# df1 - df2.reindex(df1.index)
df1.sub(df2.reindex(df1.index))

         Jan17  Jun18  Dec18  Apr19
ID Name                            
0  Nick    5.0    0.0    1.7    0.0
1  Jack    4.0    0.0    2.0    0.0
2  Fox     2.0   -3.3    0.0    0.0
3  Rex     0.0    0.0    2.0    0.0

请注意,我选择 reindex 而不是 loc 的原因是为了在缺少索引值时避免 KeyErrors。

在上述实例中,第一个解决方案将产生 NaN,因此您可以将 fill_values 指定为 reindex 以确保返回 df1 的值(而不是 NaN):

df2.reindex(df1.index, fill_value=0)

         Jan17  Jun18  Dec18  Apr19
ID Name                            
0  Nick    5.0    1.7    2.0    0.0
1  Jack    6.0    0.0    0.8    3.5
2  Fox     8.0    5.0    0.0    0.0
3  Rex     1.0    0.0    1.0    4.2

你可以简单地做

df1-df2.loc[df1.index]

输出:

         Jan17  Jun18  Dec18  Apr19
ID Name                            
0  Nick    5.0    0.0    1.7    0.0
1  Jack    4.0    0.0    2.0    0.0
2  Fox     2.0   -3.3    0.0    0.0
3  Rex     0.0    0.0    2.0    0.0

尝试新事物

sum(df1.align(0-df2,join='left'))
Out[282]: 
         Jan17  Jun18  Dec18  Apr19
ID Name                            
0  Nick    5.0    0.0    1.7    0.0
1  Jack    4.0    0.0    2.0    0.0
2  Fox     2.0   -3.3    0.0    0.0
3  Rex     0.0    0.0    2.0    0.0