如何合并包含空值的pandas DataFrame两列生成新列?
Pandas合并两列非空值问题解决
报错原因
''.join()仅支持拼接字符串类型元素,你传入的是float类型的数值(包括np.NaN也属于float类型),即使显式转成float类型也无法满足字符串拼接的参数要求,因此触发类型错误。- 核心需求是按行提取两列中的非空值,并非拼接两个字段的内容,用字符串拼接的实现思路本身和需求不匹配。
推荐实现方案
方案1:fillna填充(性能最优,适合两列合并场景)
直接用column_2的非空值填充column_1的缺失位置,一行代码即可得到目标列,是大数据量下的首选方案:
import numpy as np import pandas as pd df = pd.DataFrame({'ID': [1,2,3,4,5], 'column_1': [10.6, 10.4, np.NaN, np.NaN, np.NaN], 'column_2': [np.NaN, np.NaN, 30, 40, 50] }) df['new_column'] = df['column_1'].fillna(df['column_2']) print(df)
运行输出完全匹配预期结果:
ID column_1 column_2 new_column 0 1 10.6 NaN 10.6 1 2 10.4 NaN 10.4 2 3 NaN 30.0 30.0 3 4 NaN 40.0 40.0 4 5 NaN 50.0 50.0
方案2:combine_first(语义更明确)
该方法是pandas专门为两个Series合并非空值设计的接口,会优先保留调用方Series的非空值,空值位置用传入Series的非空值填充:
df['new_column'] = df['column_1'].combine_first(df['column_2'])
运行结果和方案1完全一致。
方案3:多列合并通用方案
如果后续需要合并3列及以上的非空值,取每行第一个非空值,可以用横向回填后取首列的方式实现,扩展列只需要修改列名列表即可:
# 示例:合并column_1、column_2两列,如需加column_3直接在列表中追加即可 df['new_column'] = df[['column_1', 'column_2']].bfill(axis=1).iloc[:, 0]
内容的提问来源于stack exchange,提问作者valentim.kodak
相关产品推荐
相关产品推荐

