python - 给定列名列表,将包含列表的多列合并为一列
问题描述
我有一个 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]
有任何想法吗?
解决方案
最简单的是使用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 - 在熊猫中查找重复项的最快方法
- python - 如何在 QTextBrowser 中显示可点击的超链接
- amazon-web-services - 从优先级队列中获取 SQS 消息
- mongodb - 如何重命名 MongoDB 数据库?(当前状态)
- powershell - 从日志文件中获取最后 30 分钟
- javascript - java脚本websocket无法连接到python server
- json - Json Response Spring boot 中的继承
- python - 如何使用请求模块从 div 获取文本?
- javascript - NodeJS Firebase 等待请求
- azure-devops - SAPUI5 xhr 请求 Azure DevOps 授权失败