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

Pandas按Rule_ID和Calc_ID分组并拼接多行数据问题

问题描述

需要同时按Rule_ID和Calc_ID分组,将多列的多行数据合并为单行,各列的多个值以逗号分隔。

数据示例

Calc_ID    Rule_ID    Name    Tracked?
100                   Rule1   Y
100                   Rule2   N
100                   Rule3   N
           YYY        Test1   Y
           YYY        Test2   Y
           YYY        Test3   N

预期结果

Calc_ID    Rule_ID    Name                   Tracked?
100                   Rule1, Rule2, Rule3    Y, N, N
           YYY        Test1, Test2, Test3    Y, Y, N

当前遇到的问题

尝试单独对每一列执行groupby操作,但首次分组后会丢失其他列,无法完成多列的合并。代码如下:

import pandas as pd

df = pd.read_csv(path)
df = df.fillna('') # 修复groupby时Calc_ID/Rule_ID的空值问题

df = df.groupby(['Rule_ID', 'Calc_ID'])['Name'].apply(','.join).reset_index()
# df = df.groupby(['Rule_ID', 'Calc_ID'])['Tracked?'].apply(','.join).reset_index()
# 此方法无效,因为初始分组会移除其他列
解决方案

不需要分开执行多次groupby,直接在一次groupby操作中使用agg方法对需要合并的列统一处理即可:

import pandas as pd

df = pd.read_csv(path)
df = df.fillna('')

# 按Rule_ID和Calc_ID分组,对Name和Tracked?列分别执行逗号拼接
result_df = df.groupby(['Rule_ID', 'Calc_ID'], as_index=False).agg({
    'Name': ', '.join,
    'Tracked?': ', '.join
})

# 调整列顺序,和原数据保持一致
result_df = result_df[['Calc_ID', 'Rule_ID', 'Name', 'Tracked?']]
print(result_df)

代码解释

  • groupby(['Rule_ID', 'Calc_ID'], as_index=False):指定分组键,as_index=False确保分组后的键作为普通列保留,无需后续reset_index操作。
  • agg({列名: 处理函数}):批量对指定列应用处理逻辑,这里用, '.join把同一分组内的列值拼接成逗号分隔的字符串。
  • 最后调整列顺序是为了和原数据的列顺序匹配,保证输出结果和预期一致。

内容的提问来源于stack exchange,提问作者KL_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 21:33:19