3 回答
TA贡献2065条经验 获得超14个赞
我认为一个简单的列表查找就可以解决问题:
df1['new_id'] = df1.apply(lambda row: row['ID'] if row['ID'] in df2['ID'].tolist() else "", axis=1)
ID Invoice new_id
0 X191 4 X191
1 X192 4
2 X212 1
3 X215 3 X215
4 X319 3 X319
找到要删除的内容后,您可以执行以下操作(我假设 ID 有\, ., '@' ):
df['ID'] = df['ID'].str.replace(r'\\|\.|@', '')
TA贡献1839条经验 获得超15个赞
您需要一个额外的cumcount基于列:
u = df1.assign(Cnt=df1.groupby('Inv').cumcount())
v = df2.assign(Cnt=df2.groupby('Inv').cumcount())
u.merge(v, on=['Inv', 'Cnt'], how='left').drop('Cnt', 1)
ID_x Inv ID_y
0 X\191 4 X191
1 R\192 4 NaN
2 733 1 NaN
3 X215 3 X215
4 BL000002 3 BL000002
TA贡献1786条经验 获得超11个赞
试试下面:
您正在寻找pandas.merge_asof. 它允许您在一个键上组合 2 个 DataFrame,在这种情况下是 time,而不要求它们完全匹配。您可以选择优先匹配的方向,但在这种情况下,很明显您想要最近的
>>> pd.merge_asof(df2.sort_values('Inv'), df1.sort_values('Inv'), on='Inv', direction='nearest')
ID_x Inv ID_y
0 215 3 X319
1 319 3 X319
2 191 4 X192
添加回答
举报