如何比较两个数据框并使用 python 获取不匹配的行?
How to compare two data frame and get the unmatched rows using python?
我有两个数据框,df1 和 df2。现在,df1 包含 6 条记录,df2 包含 4 条记录。我想从中得到无与伦比的记录。我尝试了但出现错误 ValueError: Can only compare identically-labelled DataFrame objects
我猜这是由于 df 的长度,因为 df1 有 6 而 df2 有 4 但我如何比较它们并获得不匹配的行?
代码
df1=
a b c
0 1 2 3
1 4 5 6
2 3 5 5
3 5 6 7
4 6 7 8
5 6 6 6
df2 =
a b c
0 3 5 5
1 5 6 7
2 6 7 8
3 6 6 6
index = (df != df2).any(axis=1)
df3 = df.loc[index]
给出:
ValueError: Can only compare identically-labelled DataFrame objects
预期输出:
a b c
0 1 2 3
1 4 5 6
我知道错误是由于长度引起的,但是有什么方法可以比较两个数据帧并从中找出不匹配的记录吗?
将 df.merge
与 indicator=True
结合使用并选择除 both
之外的所有行:
In [173]: df = df1.merge(df2, indicator=True, how='outer').query('_merge != "both"').drop('_merge', 1)
In [174]: df
Out[174]:
a b c
0 1 2 3
1 4 5 6
MultiIndex.from_frame
+ isin
我们可以在df1
和df2
上使用MultiIndex.from_frame
创建相应的多索引,然后使用isin
测试从[=创建的索引的成员资格index
中的 15=] 从 df2
创建以创建一个布尔掩码,然后可用于过滤不匹配的行。
i1 = pd.MultiIndex.from_frame(df1)
i2 = pd.MultiIndex.from_frame(df2)
df1[~i1.isin(i2)]
结果
a b c
0 1 2 3
1 4 5 6
我有两个数据框,df1 和 df2。现在,df1 包含 6 条记录,df2 包含 4 条记录。我想从中得到无与伦比的记录。我尝试了但出现错误 ValueError: Can only compare identically-labelled DataFrame objects
我猜这是由于 df 的长度,因为 df1 有 6 而 df2 有 4 但我如何比较它们并获得不匹配的行?
代码
df1=
a b c
0 1 2 3
1 4 5 6
2 3 5 5
3 5 6 7
4 6 7 8
5 6 6 6
df2 =
a b c
0 3 5 5
1 5 6 7
2 6 7 8
3 6 6 6
index = (df != df2).any(axis=1)
df3 = df.loc[index]
给出:
ValueError: Can only compare identically-labelled DataFrame objects
预期输出:
a b c
0 1 2 3
1 4 5 6
我知道错误是由于长度引起的,但是有什么方法可以比较两个数据帧并从中找出不匹配的记录吗?
将 df.merge
与 indicator=True
结合使用并选择除 both
之外的所有行:
In [173]: df = df1.merge(df2, indicator=True, how='outer').query('_merge != "both"').drop('_merge', 1)
In [174]: df
Out[174]:
a b c
0 1 2 3
1 4 5 6
MultiIndex.from_frame
+ isin
我们可以在df1
和df2
上使用MultiIndex.from_frame
创建相应的多索引,然后使用isin
测试从[=创建的索引的成员资格index
中的 15=] 从 df2
创建以创建一个布尔掩码,然后可用于过滤不匹配的行。
i1 = pd.MultiIndex.from_frame(df1)
i2 = pd.MultiIndex.from_frame(df2)
df1[~i1.isin(i2)]
结果
a b c
0 1 2 3
1 4 5 6