Pandas合并存储列表的DataFrame列时如何保留列表类型
pandas合并存储列表类型的列并保留列表结构方案
问题核心原因
combine_first方法仅会将None、np.nan、pd.NA这类标准缺失值识别为需要填充的对象,空列表[]属于合法的非空Python对象,因此直接调用该方法时,不会触发对空列表位置的填充逻辑,返回结果不符合预期。如果提前将列转为字符串类型实现填充,会彻底破坏列表的原生结构,后续无法直接执行列表相关操作。
可直接复用的实现方案
方案1:逐行判断取值(最简洁,无额外依赖)
直接按行判断b列的列表是否为空,为空则取a列的值,非空则保留b列的值,全程不会改动原有列表的类型:
import pandas as pd import numpy as np # 示例数据构造 df = pd.DataFrame({ 'a': [['2%', '70%'], ['100%'], ['5%', '60%']], 'b': [['2% W/V', '70% V/V'], [], ['5% W/V', '60% V/V']] }) # 生成结果列c df['c'] = df.apply(lambda row: row['b'] if len(row['b']) > 0 else row['a'], axis=1)
执行后得到的c列所有值均为原生列表类型,和预期结果完全一致,可直接和其他列表类型列做后续合并、遍历等操作。
方案2:适配combine_first逻辑
如果习惯用combine_first的写法,可以先把b列的空列表替换为标准缺失值,注意替换过程不要做全列字符串转换:
# 仅将空列表替换为pandas可识别的缺失值,保留其余值的列表类型 df['b_temp'] = df['b'].apply(lambda x: pd.NA if len(x) == 0 else x) df['c'] = df['b_temp'].combine_first(df['a']) # 删除临时辅助列 df.drop(columns='b_temp', inplace=True)
注意事项
- 处理列表类型的DataFrame列时,禁止直接对整列执行
astype(str)操作,该操作会把列表转为字符串字面量,彻底丢失列表的结构化属性,后续转回列表需要额外做字符串解析,很容易出现格式解析错误。 - 如果需要判断列表是否为空,优先通过
len(列表对象) == 0判断,不要通过字符串匹配判断。
内容的提问来源于stack exchange,提问作者Pedro Domingues
相关产品推荐
相关产品推荐

