我有一个这样的数据框:
ID1 ID2
0 foo bar
1 fizz buzz
还有一个像这样:
ID1 ID2 Count Code
0 abc def 1 A
1 fizz buzz 5 A
2 fizz1 buzz2 3 C
3 foo bar 6 Z
4 foo bar 6 Z
我想做的是过滤第二个数据帧,其中 ID1 和 ID2 与第一个数据帧中的一行匹配,每当有匹配时,我想从第一个数据帧中删除该行以避免重复。这将产生一个如下所示的数据框:
ID1 ID2 Count Code
1 fizz buzz 5 A
3 foo bar 6 Z
我知道我可以通过嵌套 for 循环、逐行遍历所有行并在每次匹配时手动从第一帧中删除一行来做到这一点,但我想知道是否有更 pythonic 的方法来做到这一点。我对 Pandas 没有经验,所以可能有一种我不知道的更简洁的方法。我以前使用过 .isin()
但不得不放弃它。每个 ID 对最多可以在数据帧中存在 N 次,我需要过滤后的帧包含一对 ID 的 0 到 N 个实例。
最佳答案
使用 merge
与 drop_duplicates
, 如果只有相同的列用于加入 df
:
df = pd.merge(df1,df2.drop_duplicates())
print (df)
ID1 ID2 Count Code
0 foo bar 6 Z
1 fizz buzz 5 A
如果只需要检查 ID
列中的重复项:
df = pd.merge(df1,df2.drop_duplicates(subset=['ID1','ID2']))
print (df)
ID1 ID2 Count Code
0 foo bar 6 Z
1 fizz buzz 5 A
如果更多的列重叠添加参数on
:
df = pd.merge(df1, df2.drop_duplicates(), on=['ID1','ID2'])
如果不删除重复行:
df = pd.merge(df1,df2)
print (df)
ID1 ID2 Count Code
0 foo bar 6 Z
1 foo bar 6 Z
2 fizz buzz 5 A
关于python - 根据另一个数据框的多列过滤数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45440523/