熊猫在具有列和多索引的两个DataFrame上计算差异

时间:2019-07-02 20:12:52

标签: pandas dataframe join diff pandas-groupby

我有2个数据帧,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  

如何基于df1中的df2多索引计算[ID, Name]df1中各列之间的差异并将结果保存到df3? / p>

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

3 个答案:

答案 0 :(得分:2)

只需减去,减法就在索引上对齐。您可以在减去之前重新索引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是为了避免缺少索引值的KeyError

在上述情况下,第一个解决方案将生成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

答案 1 :(得分: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

答案 2 :(得分:1)

尝试一些新的东西

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