串联熊猫列的最佳方法是什么?从列清单

时间:2020-03-11 16:04:14

标签: python pandas join merge

我有这样的数据框:

A     B     C    D     E      F
aa    bb    cc  dd    ee      ff
NA    ba    NA  da    ea      NA

list_col = ['A', 'B', 'C']

所以我只想合并仅在列表中的列。而且我不希望合并NA值。有什么办法吗?

所需输出

 A     B     C    D     E      F         desired_col
aa    bb    cc  dd    ee      ff          aa-bb-cc
NA    ba    NA  da    ea      NA             ba

2 个答案:

答案 0 :(得分:1)

您可以使用理解列表:

import pandas as pd

df = pd.DataFrame(
    [('aa', 'bb', 'cc', 'dd', 'ee', 'ff'), (None, 'ba', None, 'da', 'ea', None),],
    columns=['A', 'B', 'C', 'D', 'E', 'F']
 )

desired_col = ['A', 'B', 'C']

def join_values(values):
    return '-'.join(map(str, values)) if values else None


df['desired_col'] = [
    join_values(filter(lambda v : not pd.isnull(v), values))
    for values in zip(*(df[c] for c in desired_col))        
]
df
      A   B     C   D   E     F desired_col
0    aa  bb    cc  dd  ee    ff    aa-bb-cc
1  None  ba  None  da  ea  None          ba

请注意,如果您的NA值为字符串"NA",则可以简单地替换过滤功能:

df['desired_col'] = [
    join_values(filter(lambda v : v != 'NA', values))
    for values in zip(*(df[c] for c in desired_col))        
]

答案 1 :(得分:1)

您可以使用apply(..., x=1)逐行处理数据帧。但是您要忽略NaN值,因此必须排除它们。您可以使用:

df[list_col].apply(lambda x: '-'.join(x.dropna()), axis=1)

它给出:

0    aa-bb-cc
1          ba
dtype: object