gpt4 book ai didi

python - Pandas :比较 2 个数据帧而不进行迭代

转载 作者:行者123 更新时间:2023-12-05 01:22:32 26 4
gpt4 key购买 nike

考虑到我有如下所示的 2 个数据帧(DF1DF2),我需要将 DF2 与 DF1 进行比较,以便我可以识别所有匹配、不同、缺失对于具有相同 EID 值(A、B、C 和 D)的行,DF2 中与 DF1 中的列(在本例中为 Col1、Col2 和 Col3)匹配的所有列的值。我不希望迭代数据帧的每一行,因为这可能很耗时。注意:大约有 70 - 100 列。这只是我正在使用的示例数据框。

DF1

    EID Col1 Col2 Col3 Col4
0 A a1 b1 c1 d1
1 B a2 b2 c2 d2
2 C None b3 c3 d3
3 D a4 b4 c4 d4
4 G a5 b5 c5 d5

DF2

    EID Col1 Col2 Col3
0 A a1 b1 c1
1 B a2 b2 c9
2 C a3 b3 c3
3 D a4 b4 None

预期输出数据帧

    EID Col1 Col2 Col3 New_Col
0 A a1 b1 c1 Match
1 B a2 b2 c2 Different
2 C None b3 c3 Missing in DF1
3 D a4 b4 c4 Missing in DF2

最佳答案

首先,您需要根据 df2 过滤 df1。

new_df = df1.loc[df1['EID'].isin(df2['EID']), df2.columns]

EID Col1 Col2 Col3
0 A a1 b1 c1
1 B a2 b2 c2
2 C None b3 c3
3 D a4 b4 c4

接下来,由于您要比较一个大数据框,您可以将 new_dfdf2 都更改为 numpy 数组。

array1 = new_df.to_numpy()
array2 = df2.to_numpy()

现在您可以使用 np.where

按行比较它
new_df['New Col'] = np.where((array1 == array2).all(axis=1),'Match', 'Different')

EID Col1 Col2 Col3 New Col
0 A a1 b1 c1 Match
1 B a2 b2 c2 Different
2 C None b3 c3 Different
3 D a4 b4 c4 Different

最后,要转换具有None 值的行,您可以使用df.locdf.isnull

new_df.loc[new_df.isnull().any(axis=1), ['New Col']] = 'Missing in DF1'
new_df.loc[df2.isnull().any(axis=1), ['New Col']] = 'Missing in DF2'

EID Col1 Col2 Col3 New Col
0 A a1 b1 c1 Match
1 B a2 b2 c2 Different
2 C None b3 c3 Missing in DF1
3 D a4 b4 c4 Missing in DF2

关于python - Pandas :比较 2 个数据帧而不进行迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73819773/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com