![](/img/trans.png)
[英]Merge columns and fill the empty space with the merged data using Pandas Python
[英]Python / Pandas - Consider 'empty string' as a match during merge using multiple columns
我正在嘗試在多列上合並 2 個數據框: ['Unit','Geo','Region']
。 而且,條件是:當從價值right_df
遇到一個“空字符串” left_df
,就應考慮為匹配。
。例如,當第一排right_df
與第一行加入left_df
,我們有一列空字符串: 'Region'
。 因此,需要將空字符串視為與“AU”的匹配並得到最終結果“DE”。
left_df = pd.DataFrame({'Unit':['DEV','DEV','DEV','DEV','DEV','TEST1','TEST2','ACCTEST1','ACCTEST1','ACCTEST1'],
'Geo':['AP','JAPAN','NA','Europe','Europe','','','AP','Europe','NA'],
'Region':['','','','France','BENELUX','','','','',''],
'Resp':['DE','FG','BO','MD','KR','PM','NJ','JI','HN','FG']})
right_df = pd.DataFrame({'Unit':['DEV','DEV','DEV','DEV','TEST1','TEST2','ACCTEST1','DEV','ACCTEST1','TEST1','TEST2','DEV','TEST1','TEST2'],
'Geo':['AP','JAPAN','AP','NA','AP','Europe','Europe','Europe','AP','JAPAN','AP','Europe','Europe','Europe'],
'Region':['AU','JAPAN','ISA','USA','AU/NZ','France','CEE','France','ISA','JAPAN','ISA','BENELUX','CEE','CEE']})
我嘗試使用以下代碼,但僅當“空字符串”具有值時才有效。 我正在努力添加一個條件,說“將空字符串視為匹配項”或“如果right_df
遇到空字符串則忽略並繼續可用匹配項”。 將不勝感激任何幫助。 謝謝!!
result_df = pd.merge(left_df, right_df, how='inner', on=['Unit','Geo','Region'])
看起來您的映射中存在一些不匹配,但是您可以使用update
方法來處理空字符串:
# replace empty strings with nan
left_df = left_df.replace('', np.nan)
# replace np.nan with values from other dataframe
left_df.update(right_df, overwrite=False)
# merge
df = pd.merge(left_df, right_df, how='right', on=['Unit','Geo','Region'])
希望這能給你一些想法。
在列表DataFrame.merge
使用DataFrame.merge
以下順序執行left
合並操作:
在Unit
、 Geo
和Region
列right_df
與left_df
合並,然后選擇Resp
列。
合並right_df
與left_df
在列(滴在單位和地質重復的值) Unit
, Geo
和選擇列Resp
。
合並right_df
與left_df
在列(在單位下降重復的值) Unit
,然后選擇列Resp
。
然后使用functools.reduce
和一個減少函數Series.combine_first
來組合列表中s
所有系列,並將這個結果分配給right_df
Resp
列。
from functools import reduce
c = ['Unit', 'Geo', 'Region']
s = [right_df.merge(left_df.drop_duplicates(c[:len(c) - i]),
on=c[:len(c) - i], how='left')['Resp'] for i in range(len(c))]
right_df['Resp'] = reduce(pd.Series.combine_first, s)
結果:
print(right_df)
Unit Geo Region Resp
0 DEV AP AU DE
1 DEV JAPAN JAPAN FG
2 DEV AP ISA DE
3 DEV NA USA BO
4 TEST1 AP AU/NZ PM
5 TEST2 Europe France NJ
6 ACCTEST1 Europe CEE HN
7 DEV Europe France MD
8 ACCTEST1 AP ISA JI
9 TEST1 JAPAN JAPAN PM
10 TEST2 AP ISA NJ
11 DEV Europe BENELUX KR
12 TEST1 Europe CEE PM
13 TEST2 Europe CEE NJ
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.