首页 > 解决方案 > 给定列名列表,将包含列表的多列合并为一列

问题描述

我有一个 df,其中一些列包含列表

name   vector_1   vector_2   vector_3
foo    [1, 2]     [1, 3, 5]  [9]
bar    [3, 6]     [2, 4, 6]  [8]

我想生成一个新列,列表变平,同时保持列表中的整数,因此

new_col
[1, 2, 1, 3, 5, 9]
[3, 6, 2, 4, 6, 8]

这正是我需要的

df["new_col"] = df["vector_1"] + df["vector_2"] + df["vector_3"]

但是,列数(以及这些列的名称)可能会因用户而异。因此,要求是将列作为 list 传入["vector_1", "vector_2", "vector_3"]。这是我正在努力解决的问题。

像这样的东西

    df['new_col'] = df[df.columns.intersection(column_names)].apply(
        lambda x: ','.join(x.dropna().astype(str)),
        axis=1
    )

很好地使用列名列表,但将列表转换为字符串,导致

new_col
[1, 2], [1, 3, 5], [9]
[3, 6], [2, 4, 6], [8]

其中方括号是 str 的一部分。

使用“column_names”和列表理解遍历行将导致类似

new_col
[1, 2]
[3, 6]
[1, 3, 5]
[2, 4, 6]
[9]
[8]

有任何想法吗?

标签: pythonpandas

解决方案


最简单的是使用sum

df['new_col'] = df[df.columns.intersection(column_names)].sum(axis=1)
print (df)
  name vector_1   vector_2 vector_3             new_col
0  foo   [1, 2]  [1, 3, 5]      [9]  [1, 2, 1, 3, 5, 9]
1  bar   [3, 6]  [2, 4, 6]      [8]  [3, 6, 2, 4, 6, 8]

如果需要还删除缺失值:

f = lambda x: [z for y in x.dropna() for z in y]
df['new_col'] = df[df.columns.intersection(column_names)].apply(f, axis=1)

如果不:

f = lambda x: [z for y in x for z in y]
df['new_col'] = df[df.columns.intersection(column_names)].apply(f, axis=1)

推荐阅读