首页 > 解决方案 > 返回一个 DataFrame 与另一个 DataFrame 中不同的行

问题描述

有很多类似的问题,但没有一个对我有帮助,所以我假设我的版本有细微差别,我错过了。

我有两个DataFrame:df1、df2(具有相同的维度,我可以在唯一列上映射1-2-1,即名称)并且我想要df1中存在的所有行并且与df2中的相应行不同。我尝试了更优雅的解决方案,涉及 .isin() 和使用循环的丑陋解决方案。但没有什么能返回正确的解决方案。我在下面发布了一个较少 Pythonic 的解决方案,因为我相信它显示了我最明确地尝试做的事情:

    df1['hash'] = df1[common_fields].apply(lambda x: hash(tuple(x)), axis=1)
    df2['hash'] = df2[common_fields].apply(lambda x: hash(tuple(x)), axis=1)
    df = pd.DataFrame(columns=df1.columns)
    df2_hashes = df2['hash'].tolist()
    for i in range(len(df1)):
        if not df1['hash'].iloc[i] in df2_hashes:
            df = df.append(df1.iloc[i])

注意。上述尝试,返回所有行,无论是否不同。

标签: pythonpython-3.xpandas

解决方案


df1 中的每一行都与 df2 中的相应行不同。

import pandas as pd
d1 = {'A': [1, 2, 3, 4, 5],
      'B': [10, 20, 30, 40, 500],
      'C': [100, 200, 300, 400, 500]}
d2 = {'A': [1, 2, 3, 4, 5],
      'B': [10, 22, 30, 44, 500],
      'D': [100, 200, 300, 400, 500]}

df1 = pd.DataFrame(d1)
df2 = pd.DataFrame(d2)
df = df1[~((df1['A'] == df2['A']) & (df1['B'] == df2['B']))]


In [321]: df1                                                                                                           
Out[321]: 
   A    B    C
0  1   10  100
1  2   20  200
2  3   30  300
3  4   40  400
4  5  500  500

In [322]: df2                                                                                                           
Out[322]: 
   A    B    D
0  1   10  100
1  2   22  200
2  3   30  300
3  4   44  400
4  5  500  500

输出

In [330]: df                                                                                                            
Out[330]: 
   A   B    C
1  2  20  200
3  4  40  400

推荐阅读