python - pandas 获取不在其他数据框中的行

我有两个 pandas 数据框,它们有一些共同的行。

假设 dataframe2 是 dataframe1 的子集。

如何获取 dataframe1 中不在 dataframe2 中的行?

df1 = pandas.DataFrame(data = {'col1' : [1, 2, 3, 4, 5], 'col2' : [10, 11, 12, 13, 14]}) 
df2 = pandas.DataFrame(data = {'col1' : [1, 2, 3], 'col2' : [10, 11, 12]})

df1

   col1  col2
0     1    10
1     2    11
2     3    12
3     4    13
4     5    14

df2

   col1  col2
0     1    10
1     2    11
2     3    12

预期结果:

   col1  col2
3     4    13
4     5    14

最佳答案

当前选择的解决方案产生不正确的结果。为了正确解决这个问题,我们可以执行从 df1df2 的左连接,确保首先获得 df2 的唯一行.

首先,我们需要修改原来的DataFrame,添加数据为[3, 10]的行。

df1 = pd.DataFrame(data = {'col1' : [1, 2, 3, 4, 5, 3], 
                           'col2' : [10, 11, 12, 13, 14, 10]}) 
df2 = pd.DataFrame(data = {'col1' : [1, 2, 3],
                           'col2' : [10, 11, 12]})

df1

   col1  col2
0     1    10
1     2    11
2     3    12
3     4    13
4     5    14
5     3    10

df2

   col1  col2
0     1    10
1     2    11
2     3    12

执行左连接,消除 df2 中的重复项,以便 df1 的每一行恰好与 df2 的 1 行连接。使用参数 indicator 返回一个额外的列,指示该行来自哪个表。

df_all = df1.merge(df2.drop_duplicates(), on=['col1','col2'], 
                   how='left', indicator=True)
df_all

   col1  col2     _merge
0     1    10       both
1     2    11       both
2     3    12       both
3     4    13  left_only
4     5    14  left_only
5     3    10  left_only

创建一个 bool 条件:

df_all['_merge'] == 'left_only'

0    False
1    False
2    False
3     True
4     True
5     True
Name: _merge, dtype: bool

为什么其他解决方案是错误的

一些解决方案会犯同样的错误 - 他们只检查每个值在每一列中是独立的,而不是在同一行中。添加最后一行,它是唯一的,但具有 df2 中两列的值会暴露错误:

common = df1.merge(df2,on=['col1','col2'])
(~df1.col1.isin(common.col1))&(~df1.col2.isin(common.col2))
0    False
1    False
2    False
3     True
4     True
5    False
dtype: bool

这个解决方案得到同样的错误结果:

df1.isin(df2.to_dict('l')).all(1)

https://stackoverflow.com/questions/28901683/

相关文章:

linux - 如何删除具有特定名称的文件夹

linux - 遍历 ls -l 输出的每一行

linux - 在 Linux 脚本中隐藏终端上的用户输入

python - Windows Scipy 安装 : No Lapack/Blas Resourc

python - 在 SQLAlchemy 中使用 OR

python - 如何在python中声明零数组(或一定大小的数组)

python - 如何量化两个图像之间的差异?

python - 为什么在 Python 3 中 x**4.0 比 x**4 快?

linux - 如何在 Bash 中运行超时的进程?

c - 线程有不同的堆吗?