我正在尝试合并/连接两个列,其中两个列都有相关但由“|”分隔的文本数据,此外,还将某些名称替换为“”,并将|替换为“\n”。你知道吗
例如,原始数据可以是:
First Names Last Names
0 Jim|James|Tim Simth|Jacobs|Turner
1 Mickey|Mini Mouse|Mouse
2 Mike|Billy|Natasha Mills|McGill|Tsaka
如果我想合并/连接以派生全名并删除与“Smith”相关的条目,则最终的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
只是不确定如何在没有任何循环的情况下完成这个任务,或者是否有更有效/完全不同的方法。你知道吗
谢谢大家的意见!你知道吗
下面是一个使用
pd.DataFrame.apply
和一些python优秀的内置功能的简明解决方案:我真的很喜欢@AlexG's solution-请用它。你知道吗
下面是我试图创建一个创造性的一行解决方案-这是绝对反常的,所以不应该使用它-它只是为了好玩:
我有很多理解力
撇开文字播放不谈,这对示例数据来说相当快
详细解释
l
是一个列表列表。我将广泛使用列表理解和iterables。你知道吗(first, last)
名称组成的元组“列表”。我将使用if z[1] != 'Smith'
过滤掉史密斯夫妇。z[1] not in list_of_names
' '.join
(这实际上是一个函数)将每个元组组合成first last
'|'.join
来组合first last
到first1 last1|first2 last2
的子列表。。。以此类推这之所以更快,是因为理解在很大程度上得到了优化。其他的解决方案是使用
apply
,这是一种通用的循环结构,只能在特殊情况下利用快速循环(如果有人知道更多,请纠正我的错误)。使用lambda
绝对不是那种情况。你知道吗相关问题 更多 >
编程相关推荐