You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 06:53:32