【问题标题】:How to compare two dataframes and find the combination for which there is value in first dataframe but not in second如何比较两个数据帧并找到在第一个数据帧中有值但在第二个数据帧中没有值的组合
【发布时间】:2022-02-10 17:34:24
【问题描述】:

我有两个具有相同列的 pandas 数据框,分别是名称、一月、二月、三月、四月。我想比较两个数据帧并找出我在第一个数据帧中有价值但在第二个数据帧中没有价值的名称、月份组合。

df1:

Name jan feb March
ABC 125 225 NaN
DEF NaN 30 214

df2:

Name jan feb March
ABC 125 NaN NaN
XYZ 254 130 NaN

预期输出:

Name Month
ABC feb
Def feb
Def March

我试图合并这两个数据框,但它没有给我预期的结果。我不知道该怎么做。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    这是一种可能的方法:

    # only if not already index
    # df1 = df1.set_index('Name')
    # df2 = df2.set_index('Name')
    
    s = ((df1.notna()&df1.ne(df2.reindex_like(df1)))
         .rename_axis('Month', axis=1).stack())
    s[s].reset_index().drop(0, axis=1)
    

    输出:

       Name  Month
    0  ABC     feb
    1  DEF     feb
    2  DEF   March
    

    【讨论】:

      【解决方案2】:

      set_index 到 "Name" + stack + reset_index DataFrames 和外部 merge 在名称和月份上。然后按条件过滤合并后的DataFrame:

      out = df1.set_index('Name').stack().reset_index().merge(df2.set_index('Name').stack().reset_index(), on=['Name','level_1'], how='outer')
      out = out.loc[out['0_x'].notna() & out['0_y'].isna(), ['Name','level_1']].rename(columns={'level_1':'Month'})
      

      输出:

        Name  Month
      1  ABC    feb
      2  DEF    feb
      3  DEF  March
      

      【讨论】:

      • 您能解释一下您是如何使用 loc 函数过滤合并的数据帧的吗?如果满足我们的条件,out.loc[true, ['name', 'level_1']] - 这是如何工作的?
      • @Minato out['0_x'].notna() & out['0_y'].isna() 创建一个布尔掩码。我们想识别df1 中具有非NaN 值但df2 中对应的单元格具有的单元格,对吗?因此,由于来自 df1 的“_x”后缀和来自 df2 的“_y”,“out['0_x'].notna()` 正在评估来自 df1 的值是否不是 NaN . out['0_y'].isna() 正在对从 df2 合并的部分进行相反的评估。
      猜你喜欢
      • 1970-01-01
      • 2021-04-26
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      • 2020-06-22
      • 1970-01-01
      • 2021-08-02
      • 2020-10-09
      相关资源
      最近更新 更多