如何解决Python / Pandas-使用多列合并时将“空字符串”视为匹配项
我正在尝试在多列上合并2个数据框:['Unit','Geo','Region']
。并且,条件是:当right_df
中的值在left_df
上遇到“空字符串”时,应将其视为匹配项。
例如,当right_df
的第一行与left_df
的第一行联接时,列'Region'
的行为空。因此,需要将空字符串视为与“ AU”的匹配项并获得最终结果“ DE”。
left_df = pd.DataFrame({'Unit':['DEV','DEV','TEST1','TEST2','ACCTEST1','ACCTEST1'],'Geo':['AP','JAPAN','NA','Europe','','AP','NA'],'Region':['','France','BENELUX',''],'Resp':['DE','FG','BO','MD','KR','PM','NJ','JI','HN','FG']})
right_df = pd.DataFrame({'Unit':['DEV','TEST2'],'Europe'],'Region':['AU','ISA','USA','AU/NZ','CEE','CEE']})
我尝试了以下代码,但仅在“空字符串”具有值时才起作用。我正在努力添加一个条件,说“将空字符串视为匹配项”或“忽略right_df
是否遇到空字符串并继续可用的匹配项”。将不胜感激。谢谢!
result_df = pd.merge(left_df,right_df,how='inner',on=['Unit','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
并执行
left
按以下顺序合并操作:
-
在列
right_df
,left_df
和Unit
上将Geo
与Region
合并,然后选择列Resp
。 -
在
right_df
,left_df
列上将Unit
与Geo
和Resp
合并(在Unit和Geo中删除重复的值),然后选择列right_df
。 / p> -
在
left_df
列中将Unit
与Resp
合并(将重复的值放入单元中)并选择列s
。
然后将functools.reduce
与归约函数Series.combine_first
一起使用,以组合列表Resp
中的所有序列,并将此结果分配给right_df
中的from functools import reduce
c = ['Unit','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
结果:
public class CustomHandshakeHandler extends DefaultHandshakeHandler {
@Override
protected Principal determineUser(ServerHttpRequest request,WebSocketHandler wsHandler,Map<String,Object> attributes) {
LOGGER.info(request.getBody().toString());
}}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。