python - 按列表顺序将两个数据框列与列表合并

标签 python performance pandas processing-efficiency

我正在尝试合并/连接两列,两列都相关,但用“|”分隔的文本数据分开除了将某些名称替换为“”并替换 |用'\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 的一些不错的内置功能的压缩解决方案:

def combine_names(row):

    pairs = list(zip(row[0].split('|'), row[1].split('|')))
    return '\n'.join([' '.join(p) for p in pairs if p[1] != 'Simth'])

df['Full Name'] = df.apply(combine_names, axis=1)

关于python - 按列表顺序将两个数据框列与列表合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41579344/

相关文章:

python - 在wxpython的面板中嵌入网格

iphone - 如果我使用 self.fooBar 而不是 fooBar,性能会有所不同吗?

mysql - 我怎样才能使这个 MySQL 查询(带有子查询)更快?

python - Pandas :如何对子类别中的前 N ​​个观察结果进行子集(和求和)?

python - Sklearn 使用自然语言处理数值数据

python - 如何从带有注释的txt文件创建pandas数据框?

python - 保存 'fine-tuned' bert模型

python - 如何在 Matplotlib 图中单独标记条形?

python - Flask 设置代码运行一次,但不在测试期间运行

java - 在 android 中重绘位图的更快方法?