You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 18:48:28