如何在Pandas中按用户名分组并统计指定处置码的出现次数
在Pandas中按用户分组统计处置码出现次数
嘿,这事儿用Pandas的几个常用函数就能轻松搞定,我给你两种实用方案,你可以根据自己的习惯选~
首先先构造你的原始测试数据,方便验证效果:
import pandas as pd # 构造原始数据 data = { 'User Name': ['person1', 'person2', 'person1', 'person2', 'person3'], 'Disposition Code': ['Solved', 'Solved', 'Solved', 'Not Solved', 'Solved'] } df = pd.DataFrame(data)
方法一:用pd.crosstab(最直接)
crosstab是Pandas专门用来生成交叉统计表格的函数,刚好匹配你的需求——按行(用户名)和列(处置码)统计频次:
# 生成交叉表,自动统计每个用户对应处置码的次数 result = pd.crosstab(df['User Name'], df['Disposition Code']).reset_index() # 重命名列名,匹配你期望的格式 result.columns = ['User Name', 'Total Not Solved', 'Total Solved'] # 调整列的顺序,让Total Solved排在前面 result = result[['User Name', 'Total Solved', 'Total Not Solved']] print(result)
运行后输出就是你要的结果:
User Name Total Solved Total Not Solved 0 person1 2 0 1 person2 1 1 2 person3 1 0
方法二:用groupby + value_counts + unstack(更灵活)
如果需要更灵活的分组逻辑,这种组合方式也能实现:
# 按用户名分组,对处置码做值计数,再转成列格式(空值用0填充) result = df.groupby('User Name')['Disposition Code'].value_counts().unstack(fill_value=0).reset_index() # 重命名列并调整顺序 result.columns = ['User Name', 'Total Not Solved', 'Total Solved'] result = result[['User Name', 'Total Solved', 'Total Not Solved']] print(result)
这个方法的好处是,如果后续需要扩展统计逻辑(比如加过滤条件),在groupby之后更容易调整。
补充说明
如果你的数据里处置码不止Solved和Not Solved两种,crosstab和unstack都会自动把所有不同的处置码转成对应的列,非常省心。要是你只想统计指定的两种,也可以手动指定列,比如在crosstab里加columns=['Solved', 'Not Solved']参数。
内容的提问来源于stack exchange,提问作者Alter Ego
相关产品推荐
相关产品推荐

