【问题标题】:How to compare two dataframe in pandas and show differences?如何比较熊猫中的两个数据框并显示差异?
【发布时间】:2018-09-15 17:15:03
【问题描述】:

我有两个如下所述的数据框。我只想显示不匹配的行。熊猫有什么方法可以做到这一点吗?

DataFrame1

 emp_id emp_name    City    Salary
    111 aaa         pune    10000
    222 bbb         pune    20000
    333 ccc         mumbai  30000
    444 ddd         pune    40000

DataFrame2

 emp_id emp_name    City    Salary
    111 aaa         pune    60000
    222 bbb         pune    20000
    333 ccc         mumbai  30000
    444 eee         pune    40000

我想要的输出数据框是:-

emp_id  emp_name    City    Salary
111     aaa         pune    60000
444     eee         pune    40000

【问题讨论】:

  • 使用前三列作为键加入它们,并过滤最后一列不同的记录。你试过吗?
  • 为什么444 ddd pune 40000 未包含在预期输出中?还有111 aaa pune 10000?一般来说,哪些列定义了“不匹配”?
  • @DYZ 我只想显示数据框 2 中与数据框 1 不匹配的记录。基本上我想逐行比较数据框 2 和数据框 1
  • 我认为问题很明确。我可以想到一种解决方案,但它不是最优的。
  • 你的索引是多少? emp_id?换句话说,你如何判断要匹配哪些行?

标签: python python-2.7 pandas dataframe


【解决方案1】:

你可以试试这个:

df2[~df2.isin(df1).all(1)]

输出:

       emp_name  City  Salary
emp_id                       
111         aaa  pune   60000
444         eee  pune   40000

df2.isin(df1) 看起来像这样:

        emp_name  City  Salary
emp_id                        
111         True  True   False
222         True  True    True
333         True  True    True
444        False  True    True

【讨论】:

  • 不错且简洁的答案,1+
  • @PedroLobito 谢谢!但我不是 100% 它有效。但它确实看起来像。
  • 如果任一数据帧中缺少行,这将不起作用。它不会被报告。不确定这种情况是否可能。
【解决方案2】:

您可以使用concatdrop_duplicates

df1 = pd.DataFrame([["111", "aaa", "pune", "10000"],["222", "bbb", "pune", "20000"],["333", "ccc", "mumbai", "30000"],["444", "ddd", "pune", "40000"], ], columns=['emp_id', 'emp_name', 'City', 'Salary'])
df2 = pd.DataFrame([["111", "aaa", "pune", "60000"],["222", "bbb", "pune", "20000"],["333", "ccc", "mumbai", "30000"],["444", "eee", "pune", "40000"], ], columns=['emp_id', 'emp_name', 'City', 'Salary'])

print pd.concat([df2,df1]).drop_duplicates(keep=False).drop_duplicates(['emp_id'])

emp_id emp_name  City Salary
111     aaa  pune  60000
444     eee  pune  40000

【讨论】:

  • 不错且易于理解 +1。
【解决方案3】:

合并员工 ID 上的两个数据框:

m = df1.merge(df2, how='outer', on=['emp_id'])

查找不匹配的行:

mismatched = (m.emp_name_x != m.emp_name_y) | \
             (m.City_x != m.City_y) |\
             (m.Salary_x != m.Salary_y)

提取不匹配的行,从第二个数据框中选择列:

m[mismatched][['emp_id', 'emp_name_y', 'City_y', 'Salary_y']]

【讨论】:

    【解决方案4】:

    如果您的目标是检查所有行是否相同,您可以使用以下代码

    dataframe2.where(dataframe2.isin(dataframe1).all(axis=1)).dropna()
    

    【讨论】:

      【解决方案5】:

      你想做一个外连接。为了实现您可以执行以下操作:

      result = pd.merge(dataframe1, dataframe2, how = 'outer', right_on = 'emp_name', left_on = 'emp_name')
      

      因此,在上一行代码中,您指定哪一列将确定将进入结果数据框的元素。

      【讨论】:

      • 相反,需要外连接才能找到差异。
      • 抱歉,我看错了。我以为他想要比赛!正在编辑!
      猜你喜欢
      • 2013-11-23
      • 2020-05-10
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多