Pandas:如何比较多列的2个 Dataframe 并获取不匹配的列名

jdzmm42g  于 2023-03-11  发布在  其他
关注(0)|答案(1)|浏览(155)

样品代码:

import pandas as pd

data_list1 = [[1, "p1", 10.0, 20.0],[2, "p2", 15.0, 25.0],[3, "p3", 20.0, 30.0]]
df1 = pd.DataFrame(data_list1, columns=['id', 'p_name', 'qty1', 'qty2'])

data_list2 = [[1, "p1", 12.0, 22.0],[2, "p2", 16.0, 25.0],[3, "p3", 20.0, 34.0], [4, "p4", 32.0, 32.0]]
df2 = pd.DataFrame(data_list2, columns=['id', 'p_name', 'qty1', 'qty2'])

print(df1)
print(df2)

例如,如果有2个Pandas数据框,我想添加一个新列,列已经改变。基本上比较新的数据与旧的基于qty1,qty2列,看看是否有什么改变。

输入1:

id p_name  qty1  qty2
0   1     p1  10.0  20.0
1   2     p2  15.0  25.0
2   3     p3  20.0  30.0

输入2:

id p_name  qty1  qty2
0   1     p1  12.0  22.0
1   2     p2  16.0  25.0
2   3     p3  20.0  34.0
3   4     p4  32.0  32.0

预期产出:

id p_name  qty1  qty2 update_reason
0   1     p1  12.0  22.0 qty1,qty2
1   2     p2  16.0  25.0 qty1
2   3     p3  20.0  34.0 qty2
3   4     p4  32.0  32.0
3pvhb19x

3pvhb19x1#

假设 Dataframe 已经在其索引上对齐,则可以用途:

m = df1.ne(df2)
out = df2.assign(update_reason=m.dot(df1.columns+',').str[:-1])

如果首先要对齐列的子集:

cols = ['id']
m = df2[cols].merge(df1, how='left').ne(df2)
out = df2.assign(update_reason=m.dot(df1.columns+',').str[:-1])

输出:

id p_name  qty1  qty2 update_reason
0   1     p1  11.0  22.0     qty1,qty2
不同的行数,按“id”对齐
cols = ['id']
compare = ['qty1', 'qty2']
m = df2[cols].merge(df1, how='left').ne(df2)[compare]
out = df2.assign(update_reason=m.dot(m.columns+',').str[:-1].where(df2['id'].isin(df1['id'])))

输出:

id p_name  qty1  qty2 update_reason
0   1     p1  12.0  22.0     qty1,qty2
1   2     p2  16.0  25.0          qty1
2   3     p3  20.0  34.0          qty2
3   4     p4  32.0  32.0           NaN

相关问题