我試圖合併/連接兩列都有相關,但由「|」分隔的單獨文本數據除了用「」替換某些名稱並替換| '\ n'。按列表順序合併兩個數據幀列表
例如,原始數據可能是:
First Names Last Names
0 Jim|James|Tim Simth|Jacobs|Turner
1 Mickey|Mini Mouse|Mouse
2 Mike|Billy|Natasha Mills|McGill|Tsaka
如果我想合併/連擊導出全名並刪除綁「史密斯」最後的DF應該像條目:
First Names Last Names Full Names
0 Jim|James|Tim Simth|Jacobs|Turner James Jacobs\nTim Turner
1 Mickey|Mini Mouse|Mouse Mickey Mouse\nMini Mouse
2 Mike|Billy|Natasha Mills|McGill|Tsaka Mike Mills\nBilly McGill\nNatasha Tsaka
我目前的做法迄今已有:
def parse_merge(df, col1, col2, splitter, new_col, list_to_exclude):
orig_order = pd.Series(list(df.index)).rename('index')
col1_df = pd.concat([orig_order, df[col1], df[col1].str.split(splitter, expand=True)], axis = 1)
col2_df = pd.concat([orig_order, df[col2], df[col2].str.split(splitter, expand=True)], axis = 1)
col1_melt = pd.melt(col1_df, id_vars=['index', col1], var_name='count')
col2_melt = pd.melt(col2_df, id_vars=['index', col2], var_name='count')
col2_melt['value'] = '(' + col2_melt['value'].astype(str) + ')'
col2_melt = col2_melt.rename(columns={'value':'value2'})
melted_merge = pd.concat([col1_melt, col2_melt['value2']], axis = 1)
if len(list_to_exclude) > 0:
list_map = map(re.escape, list_to_exclude)
melted_merge.ix[melted_merge['value2'].str.contains('|'.join(list_map)), ['value', 'value2']] = ''
melted_merge[new_col] = melted_merge['value'] + " " + melted_merge['value2']
如果我叫:
parse_merge(names, 'First Names', 'Last Names', 'Full Names', ['Smith'])
的數據變爲:
Index First Names count value value2 Full Names
0 0 Jim|James|Tim 0 Jim Smith ''
1 1 Mickey|Mini 0 Mickey Mouse Mickey Mouse
2 2 Mike|Billy|Natasha 0 Mike Mills Mike Mills
只是不知道如何完成這一點沒有任何循環或是否有更有效的/完全不同的方法。
感謝您的所有意見!
你能解釋這是如此高效,它究竟做了什麼? 我可以或多或少地理解第一個答案(AlexG的「combin_names」方法 - 但這超出了我的意思。) 道歉爲我有限的知識。 – wingsoficarus116
@ wingsoficarus116更新了類似於解釋 – piRSquared