如何使用pandas的value_counts统计多列组合及分组服务数?
嘿,我懂你现在的需求——之前用value_counts统计单列ID的数量很顺手,但现在想升级到每个ID对应的服务数量统计,对吧?我结合你的示例数据给你几种实用的解决方案,分两种常见场景来说明~
首先先把你的示例数据代码放出来,方便后续演示:
import pandas as pd d = {'id': [1, 1, 2, 3, 3], 'service': [3, 3, 4, 2, 3], 'name': ['Joe', 'Joe', 'Bob', 'Val', 'Val']} df = pd.DataFrame(data=d)
场景1:统计每个ID对应的服务条目总数
如果你的需求是统计每个ID下一共有多少条服务记录(比如ID=1有2条服务记录),可以用groupby搭配size或者count:
# 方法1:得到Series格式的统计结果 id_service_total = df.groupby('id')['service'].size() # 方法2:转成带列名的DataFrame,更直观 id_service_total_df = df.groupby('id')['service'].size().reset_index(name='service_total_count')
运行后id_service_total_df的结果是:
| id | service_total_count |
|---|---|
| 1 | 2 |
| 2 | 1 |
| 3 | 2 |
场景2:统计每个ID对应的唯一服务数量
如果你的需求是统计每个ID下有多少种不同的服务(比如ID=3有2种不同的服务:2和3),就用groupby搭配nunique:
# 得到带列名的DataFrame结果 id_unique_service_df = df.groupby('id')['service'].nunique().reset_index(name='unique_service_count')
运行后id_unique_service_df的结果是:
| id | unique_service_count |
|---|---|
| 1 | 1 |
| 2 | 1 |
| 3 | 2 |
把统计结果合并回原DataFrame
如果你想给原表格的每一行都添加上对应ID的服务统计数据,可以用transform方法,它会把分组统计的结果广播到每一行:
# 添加每个ID的服务条目总数列 df['service_total_per_id'] = df.groupby('id')['service'].transform('size') # 添加每个ID的唯一服务数量列 df['unique_service_per_id'] = df.groupby('id')['service'].transform('nunique')
处理后的df会变成这样:
| id | service | name | service_total_per_id | unique_service_per_id |
|---|---|---|---|---|
| 1 | 3 | Joe | 2 | 1 |
| 1 | 3 | Joe | 2 | 1 |
| 2 | 4 | Bob | 1 | 1 |
| 3 | 2 | Val | 2 | 2 |
| 3 | 3 | Val | 2 | 2 |
简单说下区别:size是统计分组后的总行数,count是统计分组内非空值的数量(你的数据没有空值,所以两者结果一致);nunique则是统计分组内唯一值的数量,按需选用就好~
内容的提问来源于stack exchange,提问作者EduardoG
相关产品推荐
相关产品推荐

