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
添加回答
舉報
