python - 比较两组结果

标签 python pandas

我有以下 2 个数据框:

DF1:
   DATE           ID_1 ID_2 RESULT
0  2014-06-16     1    a    RED
1  2014-07-01     1    a    WHITE
2  2014-08-16     2    c    BLUE
3  2015-08-16     3    a    RED


DF2
   DATE           ID_1 ID_2 RESULT
0  2014-06-16     1    z    WHITE
1  2014-07-01     1    z    WHITE
2  2014-08-16     2    h    BLUE
3  2014-08-16     3    k    RED

您可以通过运行以下命令来获取:

df1 = pd.DataFrame(columns=["DATE","ID_1", "ID_2", "RESULT" ])
df2 = pd.DataFrame(columns=["DATE","ID_1", "ID_2","RESULT"])

df1["DATE"] = ['2014-06-16', '2014-07-01', '2014-08-16', '2015-08-16']
df1['ID_1'] = [1,1,2,3]
df1['ID_2'] = ['a', 'a', 'c', 'a']
df1['RESULT'] = ['RED', 'WHITE', 'BLUE', 'RED']

df2["DATE"] = ['2014-06-16', '2014-07-01', '2014-08-16' ,  '2014-08-16']
df2['ID_1'] = [1,1,2,3]
df2['ID_2'] = ['z', 'z', 'h', 'k']
df2['RESULT'] = ['WHITE', 'WHITE', 'BLUE', 'RED']

现在我需要对两者进行分组“ID_1”并比较所有列(ID_2 除外)是否相等。最好通过展示差异来实现

结果应该是这样的:

 DATE           ID_1 ID_2x ID2y  RESULTx RESULTy
 2014-06-16     1    z     a     WHITE   RED

我尝试按如下方式分组:

 grp1 = df1.groupby("ID_1")
 grp2 = df2.groupby("ID_1")

 for (g1,g2) in zip(grp1,grp2):
      g1[1][["DATE", "RESULT"]] != g2[1][["DATE", "RESULT"]]

但我认为效率不高。此外,我得到一个比较错误:

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()

知道如何继续吗?

谢谢!

最佳答案

重申问题:您想要的是比较两个数据帧并找到值不同的所有行(特定列除外)。这是一种实现方法:

cols = ['DATE', 'ID_1', 'RESULT']
cond = (df1[cols] != df2[cols]).any(axis=1)
new_df = df1[cond].merge(df2[cond], on='ID_1', how='outer', suffixes=('x','y'))

(结果与您的答案略有不同,因为我不完全确定您正在寻找的一般行为 - 请参阅我对答案的评论)。

关于python - 比较两组结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40288041/

相关文章:

python - 合并数据框和重复值

python - pandas 中 lambda 函数的正确使用

python - Pandas :获取数据帧中对角线下方的元素(索引,列)

python - 使用 Keras 后端函数时出现 InvalidArgumentError

python - 对数据进行编码以进行插补,然后进行解码

python - Gurobi Python == 和变量

python - 删除特定 csv 文件中的前导 0

python - PyQT 全屏问题

python - 从 python C API 调用内置的 'hex'

python - 使用 pandas 获取列的当前最大值并输入到新列中