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