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

标签 python pandas anti-join

我有两个 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/

相关文章:

python - 如何使用以太坊和蛇将 "complex"数据结构存储为持久数据结构

python - Base64 解码图像的 Rails API ASCII 转换错误

python - Pandas:根据另一个数据框中的值在数据框中添加新列

python - 如何将 lambda 函数应用于多列

SQL反加入删除优化

apache-spark - Spark SQL 中反连接后联合

python - ElementNotInteractableException : Message: Element is not reachable by keyboard error sending text to input field using Selenium and Python

python - 为什么 GDAL 打不开 big geo Tiff?

Python 3.5.1 更新后无法导入 numpy

sql - 如何查找未加入的记录?