[英]Match data in two columns and add match to the dataframe
我有兩個數據框:第一個數據框
Column1 Column2 Column3 0 A1 B1 C1 1 A2 B2 C2 2 A3 B3 C3 2 A4 B4 C4
第二個數據框
Column1 Column2 0 A1 S1 1 B3 S2 2 A3 S3 3 B5 S4 4 A5 S5
我想將數據表1中的Column1,COlumn2中的值與數據幀2中的Column1中的兩個表連接起來
Whatever A* value from DF2 matches with Column1 values in DF1, the corresponding Column2 value goes into Column 4 in output. Whatever D* value from DF2 matches with Column1 values in DF1, the corresponding Column2 value goes into Column 5 in output.
輸出應該是這樣的:
Column1 Column2 Column3 Column4 Column5 0 A1 B1 C1 S1 1 A2 B2 C2 2 A3 B3 C3 S3 S2 2 A4 B4 C4
A1匹配,因此S1轉到第4列,B3匹配,因此S2轉到第5列,A3匹配,因此S3到第4列,B5不匹配,因此根本不顯示A5不匹配,因此根本不顯示。
我這樣做的骯臟方式是將A *和B *值分成兩個單獨的數據幀,然后使用外部聯接將它們合並。 但是我正在尋找一種方法,而無需為df2數據創建兩個單獨的數據集。
以下代碼可完成您的示例:
result_df = (
df1.merge(
df2.rename({'Column2': 'Column4'}, axis='columns'), how='left', on=['Column1']
)
.merge(
df2.rename({'Column2': 'Column5'}, axis='columns'),
how='left',
left_on=['Column2'],
right_on=['Column1'],
)
.drop(['Column1_y'], axis='columns')
.rename({'Column1_x': 'Column1'}, axis='columns')
)
我對最后兩個命令的drop
和rename
並不滿意,但是我無法避免在第二次合並中重復進行這些列。
編輯 :忘記了最后一個rename
函數中的axis
參數。
使用上面的答案,我想出了另一種方法來實現這一點:
result_df1 = (df1.merge(
df2[df2['Column1'].str.contains(r'A')]
.rename({'Column2': 'Column4'},axis='columns'),
how='outer',
on=['Column1']
)
.merge(
df2[df2['Column1'].str.contains(r'B')]
.rename({'Column2': 'Column5','Column1': 'Column2'},axis='columns'),
how='outer',
on=['Column2']
)
.replace(np.nan, '', regex=True))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.