簡體   English   中英

Python / Pandas - 在使用多列的合並期間將“空字符串”視為匹配項

[英]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合並操作:

  1. UnitGeoRegionright_dfleft_df合並,然后選擇Resp列。

  2. 合並right_dfleft_df在列(滴在單位和地質重復的值) UnitGeo和選擇列Resp

  3. 合並right_dfleft_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM