如何在熊猫中比较两个数据框并显示差异?

时间:2018-09-15 17:15:03

标签: python python-2.7 pandas dataframe

我有两个如下所述的数据框,我只想显示不匹配的行,熊猫有没有办法做到这一点?

DataFrame1

python manage.py migrate --fake-initial

DataFrame2

>> python manage.py makemigrations <AppName>
>> python manage.py migrate --fake-initial

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

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

5 个答案:

答案 0 :(得分:3)

您可以尝试以下方法:

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 :(得分:3)

您可以使用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

答案 2 :(得分:2)

合并员工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']]

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

您要进行外部联接。为了达到目的,您可以执行以下操作:

join

因此,在前面的代码行中,您将指定列作为确定将进入结果数据帧的元素的列。