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
相关产品推荐
相关产品推荐

