Python中如何用正则筛选DataFrame列并聚合合并列值?
问题描述
我有一个包含如下列的DataFrame:
Name Company generic name generic name R&D Number (DC-) R&D Number (A) type A AB 53654 5767 1111 3333 a C CD 56767 56667
我想要创建这个DataFrame的子集,把匹配特定模式的列的值用逗号聚合合并,目标输出如下:
Name Company generic name R&D Number A AB 53654, 5767 1111, 3333 C CD 56767 56667
我已经知道可以用df.filter(regex=("R&D Number.*"))基于正则筛选列,但不清楚怎么把筛选后的列和其他列结合,并且通过逗号拼接值得到最终输出,求帮助。
解决方案
可以通过分组筛选列→逐行拼接非空值→保留目标列的步骤实现需求,具体如下:
1. 处理"generic name"系列列
先筛选所有包含"generic name"的列,逐行拼接非空值:
# 筛选所有generic name相关列 generic_cols = df.filter(regex="generic name").columns # 逐行拼接非空值,用逗号分隔 df["generic name"] = df[generic_cols].apply(lambda x: ', '.join(x.dropna().astype(str)), axis=1)
2. 处理"R&D Number"系列列
用同样逻辑处理研发编号列:
# 筛选所有R&D Number相关列 rd_cols = df.filter(regex="R&D Number").columns # 逐行拼接非空值 df["R&D Number"] = df[rd_cols].apply(lambda x: ', '.join(x.dropna().astype(str)), axis=1)
3. 构建最终子集
保留需要的核心列,移除原始重复列和不需要的type列:
final_df = df[["Name", "Company", "generic name", "R&D Number"]]
完整代码示例
import pandas as pd # 构造示例DataFrame(模拟原始数据) data = { "Name": ["A", "C"], "Company": ["AB", "CD"], "generic name": ["53654", "56667"], "generic name.1": ["5767", pd.NA], "R&D Number (DC-)": ["1111", "56667"], "R&D Number (A)": ["3333", pd.NA], "type": ["a", pd.NA] } df = pd.DataFrame(data) # 处理generic name列 generic_cols = df.filter(regex="generic name").columns df["generic name"] = df[generic_cols].apply(lambda x: ', '.join(x.dropna().astype(str)), axis=1) # 处理R&D Number列 rd_cols = df.filter(regex="R&D Number").columns df["R&D Number"] = df[rd_cols].apply(lambda x: ', '.join(x.dropna().astype(str)), axis=1) # 生成最终结果 final_df = df[["Name", "Company", "generic name", "R&D Number"]] print(final_df)
运行输出:
Name Company generic name R&D Number 0 A AB 53654, 5767 1111, 3333 1 C CD 56667 56667
关键说明
apply(..., axis=1):指定逐行处理数据dropna():跳过空值,避免拼接出多余的逗号astype(str):确保数值类型的列能被正确转换为字符串拼接
内容的提问来源于stack exchange,提问作者rshar
相关产品推荐
相关产品推荐

