我有两个 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
import pandas as pd
df1 = pd.DataFrame(data = {'col1' : [1, 2, 3, 4, 5], 'col2' : [10, 11, 12, 13, 14]})
df2 = pd.DataFrame(data = {'col1' : [1, 2, 3], 'col2' : [10, 11, 12]})
#使用~和merge获得df1中不存在于df2中的行。
df_diff = df1[~df1.isin(df2).all(axis=1)]
print(df_diff)
这将打印以下输出:
col1 col2
3 4 13
4 5 14
这段代码是如何工作的:
-
df1[~df1.isin(df2).all(axis=1)]
: 这段代码使用布尔索引从df1
中选择行。让我们将其分解为: -
df1.isin(df2)
: 这将创建一个布尔 DataFrame,其中如果df1
中的值也存在于df2
中,则为True
,否则为False
。 -
.all(axis=1)
: 这会检查每一行是否所有值都为True
(意味着该行完全存在于df2
中)。 -
~
: 此运算符反转布尔值,因此我们选择所有行,其中至少有一个值 不 存在于df2
中。
这有效地过滤了
df1
,只留下
df2
中没有的那些行。
注意:
此解决方案假定两个 DataFrame 的列名相同。如果列名不同,则需要在使用
isin
和
merge
方法之前重命名列,或者在
merge
中指定要比较的列。