Pandas实现按A列分组后动态将B列值转为列并计数
动态列转换计数实现方案
你需要实现的逻辑是按A列分组,统计B列各取值的出现次数,同时自动将B列的所有唯一值转换为新列,不需要手动硬编码列名,以下两种方法都可以实现需求:
原始测试数据
先复现你给出的源DataFrame:
import pandas as pd df1 = pd.DataFrame( {'A': {0: '1', 1: '7', 2: '7', 3: '1', 4: '7', 5: '1'}, 'B': {0: 'S', 1: 'S', 2: 'D', 3: 'D', 4: 'D', 5: 'S'}})
方法1:使用crosstab(最适配场景)
pd.crosstab()是pandas专门用于交叉统计的函数,会自动提取列维度的唯一值生成列,统计对应行列组合的计数,代码最简洁:
# 交叉统计,自动生成B取值对应的列 df2 = pd.crosstab(index=df1['A'], columns=df1['B']).reset_index() # 调整列顺序和你给出的目标结构完全一致 df2 = df2[['A', 'S', 'D']]
运行后输出的df2和你给出的目标结果完全匹配:
| A | S | D | |
|---|---|---|---|
| 0 | 1 | 2 | 1 |
| 1 | 7 | 1 | 2 |
方法2:基于已掌握的groupby实现
如果想沿用groupby的逻辑,分组计数后用unstack()将B列的取值从索引层级转为独立列即可,同样支持动态生成列,后续B列新增取值不需要修改代码:
# 按A、B分组计数后,将B的索引层级展开为列 df2 = df1.groupby(['A', 'B']).size().unstack(fill_value=0).reset_index() # 按需调整列顺序 df2 = df2[['A', 'S', 'D']]
两种方法都不需要提前指定B列有多少种取值,会自动识别所有唯一值生成对应列,满足动态转换的需求。
内容的提问来源于stack exchange,提问作者Mahdi Shad
相关产品推荐
相关产品推荐

