如何在Pandas中按Band及ID前缀分组合并ID列并保留其他列?
Pandas DataFrame 分组合并ID解决方案
核心思路
- 先区分纯数字ID与字母开头ID,对字母开头ID提取首字母前缀
- 纯数字ID的行直接保留,不做合并
- 字母开头的行按
Band+首字母前缀分组,将同组ID用逗号连接,其他列保持不变
代码实现
1. 导入依赖并模拟数据
import pandas as pd # 模拟目标数据结构(实际替换为你的数据源) data = { 'ID': ['123', 'A001', 'A002', 'B001', '456', 'B002'], 'Band': ['X', 'X', 'X', 'X', 'Y', 'Y'], 'Col3': ['val1', 'val2', 'val2', 'val3', 'val4', 'val3'], 'Col4': ['a', 'b', 'b', 'c', 'd', 'c'], # 补充剩余3列... } df = pd.DataFrame(data)
2. 添加辅助列(高效矢量化操作)
# 标记ID是否为纯数字 df['is_digit'] = df['ID'].str.isdigit() # 提取字母前缀(仅对非纯数字ID生效,纯数字ID设为None) df['prefix'] = df['ID'].str[0].where(~df['is_digit'], None)
3. 分离处理并合并结果
# 提取纯数字ID的行,直接保留 digit_rows = df[df['is_digit']].drop(columns=['is_digit', 'prefix']) # 处理字母开头的行:按Band、前缀、其余所有列分组,合并ID non_digit_groups = [col for col in df.columns if col not in ['ID', 'is_digit', 'prefix']] merged_non_digit = df[~df['is_digit']].groupby(['Band', 'prefix'] + non_digit_groups)['ID'].agg(','.join).reset_index() # 合并两类结果,清理冗余列并排序 final_df = pd.concat([digit_rows, merged_non_digit.drop(columns=['prefix'])]) \ .sort_values('Band') \ .reset_index(drop=True)
关键说明
- 用矢量化字符串方法替代
apply,确保80万行数据的处理效率 - 分组时包含所有其他列,保证合并后非ID/Band列与原数据一致(若同组内其他列存在差异,需提前确认业务规则)
- 最终结果保留了纯数字ID的原始行,同时合并了同Band同前缀的字母ID行
内容的提问来源于stack exchange,提问作者KRANTHI KUMAR
相关产品推荐
相关产品推荐

