python - Pandas - 如何将多个列组合成一个以列表作为值的新列?

标签 python pandas numpy

我有一个包含图像的数据框:

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

我想删除 IMAGE_MAINIMAGE_[2..6] 列并创建一个新的 IMAGES:

SOME_COL SOME_COL     IMAGES
   *        *       [0,1,2,3,5]

如果任何图像是 NaN,我想跳过该值而不是将 NoneNaN 添加到列表中。

我试过了,但这显然不是一个好方法:

    main_image = data_main['IMAGE_MAIN']
    image_2 = data_main['IMAGE_2']
    image_3 = data_main['IMAGE_3']
    image_4 = data_main['IMAGE_4']
    image_5 = data_main['IMAGE_5']
    image_6 = data_main['IMAGE_6']
    images = [x for x in [IMAGE_MAIN, IMAGE_2, IMAGE_3, IMAGE_4, IMAGE_5, IMAGE_6] if x]
    data_main['IMAGES'] = images

最佳答案

您可以先使用 DataFrame.filter 过滤以“IMAGE”开头的列,然后使用 DataFrame.apply 按行应用函数它丢弃每行的 NaN 并将其转换为单个列表

df['IMAGES'] = (
    df.filter(like='IMAGE')
      .apply(lambda row: row.dropna().tolist(), axis=1)
)

请注意,如果一行包含 NaN,则结果列表将包含 float ,而不是整数。如果您想确保值是整数,请使用 lambda row: row.dropna().astype(int).tolist()

关于python - Pandas - 如何将多个列组合成一个以列表作为值的新列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72592043/

相关文章:

python - 以欧洲格式显示 pandas 数据框

python - 四舍五入到最接近的步长

python - PANDAS:传递的索引形状不正确,不确定如何修复

python - 将 bool 值映射到字符串

python - 如何处理 Python 中的不确定形式

python - 如何在解析 html 表时忽略 th 标签?

python - 插入取自 for 循环的值

python - Flask 未检测到来自表单的 POST 请求

python - Matplotlib - 为黑色背景演示幻灯片创建绘图

python - Pandas:检查和更改列中的所有项目