python - 给定列名称列表,将包含列表的多个列合并为一列

标签 python pandas

我有一个 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"]

但是,列数(以及这些列的名称)可能会因一个用户而异。因此,要求将列作为列表 ["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]

其中方括号是字符串的一部分。

使用“column_names”和列表理解迭代行会导致类似的结果

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

有什么想法吗?

最佳答案

最简单的是使用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)

关于python - 给定列名称列表,将包含列表的多个列合并为一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67684370/

相关文章:

python 2.7 : How to get the list of static variables in a class?

python - Pandas : select row where column A does not begin with column B

Python 使用键从文本中提取值

python - Python中的文字可以被覆盖吗?

python - Pandas dropna,哪些行被删除

python - 使用 pandas 将带有填充零的序列号附加到序列中

python - Pandas:如何创建一个简单的计数器来增加每 n 行?

python - 系列图 - 将 y 轴设置为系列值

python - django datetime 到 unix 时间戳

python - 将 value-dict 重新映射到 Pandas 中的列