Pandas 删除一个数据框中与另一个数据框中的列中的行共享公共值的行
Pandas drop rows in one dataframe that share a common value with a rows in a column of another dataframe
我有一个名为 x1 的数据框:
FID g1 g2 g3
0 19 20 13
1 16 11 14
2 15 20 11
和一个名为 x2 的数据框:
FID g1
1 16
我想更改 x1,使其不包含 x2 中的行:
FID g1 g2 g3
0 19 20 13
2 15 20 11
我试过:
x1 = pd.concat([x1,x2]).drop_duplicates(keep=False)
但认为这仅在数据框具有匹配模式时才有效。我可以只保留 x1 中不共享 x2 中的 FID 值的行吗?
您可以使用 pd.Series.isin
创建 x1
的 FID
列中出现在 [=15= 的 FID
列中的值的布尔序列].
然后简单地使用 pd.DataFrame.loc
和运算符 ~
来反转布尔系列和 select x1
的行,其值在 FID
列不要出现在x2
的FID
列中:
cond = x1.FID.isin(x2.FID)
x1.loc[~cond]
# output:
FID g1 g2 g3
0 0 19 20 13
2 2 15 20 11
x1.drop(x2['FID'])
输出
FID g1 g2 g3
0 0 19 20 13
2 2 15 20 11
我有一个名为 x1 的数据框:
FID g1 g2 g3
0 19 20 13
1 16 11 14
2 15 20 11
和一个名为 x2 的数据框:
FID g1
1 16
我想更改 x1,使其不包含 x2 中的行:
FID g1 g2 g3
0 19 20 13
2 15 20 11
我试过:
x1 = pd.concat([x1,x2]).drop_duplicates(keep=False)
但认为这仅在数据框具有匹配模式时才有效。我可以只保留 x1 中不共享 x2 中的 FID 值的行吗?
您可以使用 pd.Series.isin
创建 x1
的 FID
列中出现在 [=15= 的 FID
列中的值的布尔序列].
然后简单地使用 pd.DataFrame.loc
和运算符 ~
来反转布尔系列和 select x1
的行,其值在 FID
列不要出现在x2
的FID
列中:
cond = x1.FID.isin(x2.FID)
x1.loc[~cond]
# output:
FID g1 g2 g3
0 0 19 20 13
2 2 15 20 11
x1.drop(x2['FID'])
输出
FID g1 g2 g3
0 0 19 20 13
2 2 15 20 11