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_
相关产品推荐
相关产品推荐

