Python中按指定列分组将多行内容合并为逗号分隔字符串问题
实现代码
import pandas as pd keys = ['ID'] df = pd.DataFrame({ 'ID' : ['01','01','02','03','03','03'], 'Award' : ['PELL','SCH','SCH','GRANT','PELL','SCH'], 'Type' : ['FED','LOC','LOC','STA','FED','LOC'], 'Date' : ['2021-06-01','2021-06-01','2021-06-04','2021-06-02','2021-06-15','2021-07-01'], }) # 分组后对所有非分组列执行逗号拼接 df_res = df.groupby(keys, as_index=False).agg(lambda series: ', '.join(series))
输出结果
ID Award Type Date 0 01 PELL, SCH FED, LOC 2021-06-01, 2021-06-01 1 02 SCH LOC 2021-06-04 2 03 GRANT, PELL, SCH STA, FED, LOC 2021-06-02, 2021-06-15, 2021-07-01
说明
as_index=False参数会将分组键保留为普通数据列,不会转换为行索引,符合预期输出的表结构。agg传入的匿名函数会作用于每个分组下的所有非分组列,将列内的所有值用逗号拼接为单个字符串,由于所有列已提前转换为字符串类型,不存在类型兼容问题。- 该实现支持多列分组场景,仅需要修改
keys列表内的分组列名即可,无需调整其他逻辑。
原有写法问题说明
groupby.apply(', '.join)的传入参数是分组后的完整DataFrame对象,join方法默认迭代DataFrame的列名进行拼接,因此会输出列名拼接的错误结果。groupby.agg(list)已将分组后的各列值转换为列表,也可以通过后续执行dfc.applymap(', '.join).reset_index()得到目标结果,但直接在agg阶段完成拼接效率更高。
内容的提问来源于stack exchange,提问作者dmonder
相关产品推荐
相关产品推荐

