【问题标题】:Pandas calculate difference on two DataFrames with column and multi-indicesPandas 使用列和多索引计算两个 DataFrame 的差异
【发布时间】:2019-11-13 12:20:23
【问题描述】:

我有 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

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

【问题讨论】:

  • ID 和 Name 是否已经设置为各自数据框的索引?
  • @cs95,是的,我是用df1.set_index(['ID','Name'], inplace=True)df2.set_index(['ID','Name'], inplace=True)设置的

标签: pandas dataframe join diff pandas-groupby


【解决方案1】:

只是减法,减法是在索引上对齐的。您可以在减去之前重新索引 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_valuesreindex 以确保返回 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

【讨论】:

    【解决方案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
    

    【讨论】:

    • 如果缺少某些索引,loc 将引发 KeyError。重新索引更安全
    【解决方案3】:

    尝试新事物

    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
    

    【讨论】:

    • pd.DataFrame.sub(*df1.align(df2, join='left'))
    • @WeNYoBen,请问为什么会有0 - df2?谢谢
    猜你喜欢
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 2020-04-13
    相关资源
    最近更新 更多