我有两个Pandas数据框;让我们一个叫old_df
另一个new_df
。我要突出显示new_df
中不存在的行old_df
。因此,例如:
import pandas as pd
old_df = pd.DataFrame({'m':[1,2,3,4,5,6],
'n':['a','b','c','d','e','f']})
new_df = pd.DataFrame({'m':[2,5,7,8],
'n':['b','e','g','h']})
这些数据框如下所示:
m n
0 1 a
1 2 b
2 3 c
3 4 d
4 5 e
5 6 f
和
m n
0 2 b
1 5 e
2 7 g
3 8 h
我想为此创建一个掩码,new_df
以指示该行是否已经存在old_df
,例如:
0 True
1 True
2 False
3 False
我已经能够将列作为字符串连接为单个字符串值,以产生两个Pandas系列,然后.isin()
在两个系列上使用,如下所示:
msk = pd.Series(new_df['m'].astype(str) + new_df['n']).isin(pd.Series(old_df['m'].astype(str) + old_df['n']))
print(msk)
生产:
0 True
1 True
2 False
3 False
dtype: bool
这是正确的结果,但是太丑陋以致无法给出最佳答案。我以为.isin()
也许也可以在数据帧上工作,但是我无法使它工作。
有什么建议?
如果新数据框中没有重复的数据,则可以将它们串联起来并检查是否存在重复:
(pd.concat([d.assign(is_old=n) for d,n in zip((old_df,new_df), ('old','new'))])
.assign(from_old=lambda x: x.duplicated(['m','n']))
.query('is_old=="new"')
)
输出:
m n is_old from_old
0 2 b new True
1 5 e new True
2 7 g new False
3 8 h new False
或者你可以用merge
与indicator=True
:
(old_df.merge(new_df, on=['m','n'], how='right', indicator=True)
.assign(from_old=lambda x: x['_merge']=='both')
)
输出:
m n _merge from_old
0 2 b both True
1 5 e both True
2 7 g right_only False
3 8 h right_only False
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句