Python Groupby计数问题:桑基图数据预处理遇阻
解决桑基图数据分组统计的问题
我明白你在制作桑基图时遇到的分组统计问题了——你需要统计event_action_num到next_action_num的跳转次数,并用三列格式输出,但直接用groupby().count()没得到预期结果。
问题原因
你当前的代码df_new.groupby(['event_action_num', 'next_action_num']).count()会做两件不符合你需求的事:
- 它会统计每组内所有非分组列的非空值数量(比如你的示例里会统计
index列的计数,但结果会保留这个列名,而不是你想要的count_of) - 分组字段
event_action_num和next_action_num会变成DataFrame的多级索引,而不是普通列,格式和你期望的不一致。
解决方案
这里有两种简单的方法可以得到你想要的结果:
方法1:使用size()统计行数(推荐)
size()会直接统计每组的总行数,配合reset_index()把索引转成普通列,再用name参数指定计数列的名称:
df_new_2 = df_new.groupby(['event_action_num', 'next_action_num']).size().reset_index(name='count_of')
方法2:指定列使用count()
如果你更习惯用count(),可以指定一个没有空值的列(比如你的index列)来统计,同样需要reset_index()调整格式:
df_new_2 = df_new.groupby(['event_action_num', 'next_action_num'])['index'].count().reset_index(name='count_of')
结果验证
用你提供的示例数据运行上述代码,会得到如下格式的结果:
| event_action_num | next_action_num | count_of |
|---|---|---|
| 0 | 6 | 3 |
| 0 | 7 | 1 |
| 1 | 5 | 2 |
| 1 | 6 | 3 |
| 1 | 7 | 1 |
| 2 | 6 | 1 |
| 3 | 6 | 1 |
完全符合你想要的输出格式,后续就可以用这个数据来制作桑基图啦。
内容的提问来源于stack exchange,提问作者Kirk
相关产品推荐
相关产品推荐

