[英]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.