Pandas分组统计后如何将category转为列,实现每个唯一id对应单行数据
需求可行性说明
该需求完全可以实现,属于pandas常规的长表转宽表操作,你通过groupby得到的是两层索引的聚合长表,仅需几行代码即可转换为目标的单id单行结构。
具体实现方法
你当前拿到的df.groupby(['ids','category'])['counts'].sum()输出是带有ids、category两层行索引的Series对象,推荐两种适配性极强的实现方式:
- 方法1:直接基于现有groupby结果调用
unstack()转换,代码最简洁
# 将category层索引转为列,缺失分类值自动填0 wide_df = df.groupby(['ids','category'])['counts'].sum().unstack(fill_value=0) # 给列名统一加_n后缀 wide_df.columns = [f"{c}_n" for c in wide_df.columns] # 将ids从索引还原为普通列,方便后续和其他表合并 wide_df = wide_df.reset_index()
执行后输出的结果和你给出的目标格式完全一致,没有对应分类记录的位置会自动填充0。
- 方法2:使用
pivot_table直接生成宽表,逻辑更直观,不需要处理groupby返回的多层索引
import pandas as pd wide_df = pd.pivot_table( df, index="ids", columns="category", values="counts", aggfunc="sum", fill_value=0 ) wide_df.columns = [f"{c}_n" for c in wide_df.columns] wide_df = wide_df.reset_index()
补充说明:两种方法的
fill_value=0参数是关键,会自动把id没有对应分类的空缺位置补为0,不需要额外调用fillna()做二次处理,转换完成后可直接用ids字段作为关联键和其他数据表做合并操作。
内容的提问来源于stack exchange,提问作者EmilyCurious
相关产品推荐
相关产品推荐

