亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Pandas 強制對包含重復鍵的列進行一對一合并

Pandas 強制對包含重復鍵的列進行一對一合并

蠱毒傳說 2021-09-25 14:08:04
我有兩個Dataframes,df1:| ID        | Invoice   |-------------------------| X\191     | 4         || R\192     | 4         || 733       | 1         || X215      | 3         || BL000002  | 3         |df2:| ID        | Invoice   |-------------------------| X191      | 4         || X215      | 3         || BL000002  | 3         |我應該將它們一一合并以獲得:| ID        | Invoice   | ID        |-------------------------------------| X\191     | 4         | X191      || X\192     | 4         |           || 733       | 1         |           || X215      | 3         | X215      || BL000002  | 3         | BL000002  |但是當我進行外部合并時,我會得到重復的值import pandas as pddict1 = {"ID": ["X\\191","R\\192","733","X215","BL000002"], "Inv": [4,4,1,3,3]}df1 = pd.DataFrame.from_dict(dict1)dict2 = {"ID": ["X191","X215","BL000002"], "Inv": [4,3,3]}df2 = pd.DataFrame.from_dict(dict2)some_df = pd.merge(df1, df2, on = 'Inv', how='outer')輸出看起來像:    ID_x    Inv    ID_yX\191       4      X191X\192       4      X191733         1       NaNX215        3      X215X215        3  BL000002BL000002    3      X215BL000002    3  BL000002我怎樣才能合并,以便我讓它一對一地加入而不是混合和匹配。我不能在合并中使用任何其他列,因為它們在實際數據中會有所不同。編輯和解釋 對不起。我說得不夠清楚。列 ID 不一致。我也不能保證它是否總是一個子字符串。但發票值必須相同。這是人類一年多來輸入的,大約有 15K 行。我需要對它們進行排序,以使具有相同 Invoice 值的那些彼此相鄰,因此當其中一個數據幀(最初是 Excel 表)中缺少某些內容時,手動驗證會更容易
查看完整描述

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'\\|\.|@', '')


查看完整回答
反對 回復 2021-09-25
?
紫衣仙女

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


查看完整回答
反對 回復 2021-09-25
?
Qyouu

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


查看完整回答
反對 回復 2021-09-25
  • 3 回答
  • 0 關注
  • 257 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號