如何合并Pandas DataFrame中含Null值的字符串列?
问题分析
你遇到的问题很典型:当DataFrame中存在None(在pandas里会被自动转换为NaN)时,直接用+做字符串拼接会导致整行结果变成NaN——这是因为pandas中任何涉及NaN的字符串运算都会返回NaN,哪怕只有一个空值,整个拼接结果就会失效。
解决方案
我们可以通过逐行过滤非空值再拼接的方式解决这个问题,这里提供两种简洁的实现方式:
方法1:直接过滤None值拼接
先筛选出所有以val开头的列,然后逐行处理,只保留非空值进行拼接:
import pandas as pd # 初始化你的DataFrame df = pd.DataFrame({'id':[1,2,3,4], 'val1':['21','22','3','35'], 'val2':['99',None,'91','67'], 'val3':['21','45','76','88']}) # 筛选所有以val开头的列 val_columns = [col for col in df.columns if col.startswith('val')] # 逐行拼接非空值 df['val'] = df[val_columns].apply(lambda row: ','.join(item for item in row if item is not None), axis=1)
方法2:先填充空值再过滤空字符串
如果你的DataFrame中可能同时存在None和空字符串,可以先将None填充为空字符串,再过滤掉空内容后拼接:
# 筛选目标列的另一种写法 val_columns = df.filter(like='val').columns # 填充空值后拼接非空内容 df['val'] = df[val_columns].fillna('').apply(lambda row: ','.join(item for item in row if item), axis=1)
最终结果
运行上述代码后,你会得到完全符合预期的输出:
id val1 val2 val3 val 0 1 21 99 21 21,99,21 1 2 22 None 45 22,45 2 3 3 91 76 3,91,76 3 4 35 67 88 35,67,88
内容的提问来源于stack exchange,提问作者Sociopath
相关产品推荐
相关产品推荐

