我有这样的数据框:
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
答案 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