gpt4 book ai didi

python - python中不同级别的anti join pandas数据帧

转载 作者:行者123 更新时间:2023-11-28 18:08:39 26 4
gpt4 key购买 nike

我有两个 pandas 数据框,分别是 df1 和 df2。 df1 有 6 个变量,df2 有 5 个变量。 两个数据框中的第一个变量都是字符串格式,reaming 是 int 格式。

我想通过使用前 3 个来识别两个数据框中不匹配的记录 两个数据框的列,并且必须将它们从 df1 数据框中排除。

为此,我尝试了以下代码,但如果我放弃了,它会为我抛出 Nan 值 Nan 值然后所需的数据将被删除。

输入数据:-

**df1:-**                 **df2:-**  

x1 x2 x3 x4 x5 x6 x1 x2 x3 x4 x5
SM 1 1 2 3 3 RK 2 4 3 4
RK 2 2 3 4 5 SM 1 1 3 3
NBR 1 2 2 5 6 NB 1 2 3 2
CBK 2 5 6 7 8 VSB 5 6 3 2
VSB 5 6 4 2 1 CB 2 6 4 1
SB 6 2 3 2 1 SB 6 2 4 1

expected_out_put:-

x1  x2 x3 x4 x5 x6
RK 2 2 3 4 5
CBK 2 5 6 7 8
NBR 1 2 2 5 6

语法:-

data_out=df1[~df1['x1','x2','x3'].isin(df2['x1','x2','x3'])]
data_out=data_out.dropna()

请任何人帮助我解决这个问题。

提前致谢。

最佳答案

使用merge首先使用左连接,从 df2 中获取添加列的列名,并通过它们过滤掉所有非 NaN 的行:

df = df1.merge(df2, on=['x1', 'x2', 'x3'], how='left', suffixes=('','_'))
print (df)
x1 x2 x3 x4 x5 x6 x4_ x5_
0 SM 1 1 2 3 3 3.0 3.0
1 RK 2 2 3 4 5 NaN NaN
2 NB 1 2 2 5 6 3.0 2.0
3 CB 2 5 6 7 8 NaN NaN
4 VSB 5 6 4 2 1 3.0 2.0
5 SB 6 2 3 2 1 4.0 1.0

cols = df.columns.difference(df1.columns)
print (cols)
Index(['x4_', 'x5_'], dtype='object')

df = df.loc[df[cols].isnull().all(axis=1), df1.columns.tolist()]
print (df)
x1 x2 x3 x4 x5 x6
1 RK 2 2 3 4 5
3 CB 2 5 6 7 8

编辑:

根据您的样本数据,我得到:

df = df1.merge(df2, on=['x1', 'x2', 'x3'], how='left', suffixes=('','_'))
print (df)
x1 x2 x3 x4 x5 x6 x4_ x5_
0 SM 1 1 2 3 3 3.0 3.0
1 RK 2 2 3 4 5 NaN NaN
2 NBR 1 2 2 5 6 NaN NaN
3 CBK 2 5 6 7 8 NaN NaN
4 VSB 5 6 4 2 1 3.0 2.0
5 SB 6 2 3 2 1 4.0 1.0

cols = df.columns.difference(df1.columns)
print (cols)
Index(['x4_', 'x5_'], dtype='object')

df = df.loc[df[cols].isnull().all(axis=1), df1.columns.tolist()].x1.tolist()
print (df)
x1 x2 x3 x4 x5 x6
1 RK 2 2 3 4 5
2 NBR 1 2 2 5 6
3 CBK 2 5 6 7 8

关于python - python中不同级别的anti join pandas数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52042732/

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