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

Pandas如何将多列合并为值为列表的新列(自动跳过NaN值)

需求说明

现有存储图片信息的DataFrame,结构示例如下:

SOME_COL SOME_COL IMAGE_MAIN IMAGE_2 IMAGE_3 IMAGE_4 IMAGE_5 IMAGE_6
   *        *          0       1       2       3       NaN     5

需要实现两个处理逻辑:

  • 删除IMAGE_MAIN以及IMAGE_2到IMAGE_6共6个原始图片列
  • 新增IMAGES列,按原图片列的顺序,把每行非空的图片值存入列表,空值NaN/None直接跳过,不加入列表
    目标处理效果如下:
SOME_COL SOME_COL     IMAGES
   *        *       [0,1,2,3,5]

原写法的问题在于直接对整列对象做列表推导,是按列维度处理而非逐行聚合,会出现长度不匹配、空值判断逻辑失效的问题,执行效率和正确性都无法保证。

推荐实现代码
import pandas as pd

# 统一维护需要聚合的图片列名,后续调整列只需要修改这个列表
image_columns = ['IMAGE_MAIN', 'IMAGE_2', 'IMAGE_3', 'IMAGE_4', 'IMAGE_5', 'IMAGE_6']

# 逐行聚合非空图片值为列表
data_main['IMAGES'] = data_main[image_columns].apply(
    lambda row: [val for val in row if pd.notna(val)],
    axis=1
)

# 删除原始图片列
data_main = data_main.drop(columns=image_columns)
实现细节说明
  • 用pd.notna()做非空判断,比直接写if x更严谨,能正确识别所有pandas体系下的空值(NaN/None/pd.NA),不会把0、空字符串这类合法值误判为空值过滤掉
  • 逐行处理时严格遵循原始图片列的顺序,聚合后的列表元素顺序和原列顺序完全一致
  • 如果你的数据量超过10万行,对性能要求更高,可以替换聚合逻辑为itertuples遍历写法,速度比apply快2~3倍:
data_main['IMAGES'] = [
    [val for val in row if pd.notna(val)]
    for row in data_main[image_columns].itertuples(index=False, name=None)
]

内容的提问来源于stack exchange,提问作者Milano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 20:09:20