如何在Pandas分组数据中统计name字段的重复出现次数?
分组统计DataFrame内name的出现次数并添加新列
原DataFrame数据
d = {'id_1': [1, 1, 1, 1, 1, 2, 2, 2, 2, 2], 'id_2': [50, 50, 25, 25, 25, 4, 4, 4, 5, 5], 'name': ['Kim', 'Kim', 'Kim', 'Kim', 'Mike', 'Kim', 'Saul', 'Saul', 'Kim', 'Kim']} df = pd.DataFrame(data=d)
对应表格:
| id_1 | id_2 | name |
|---|---|---|
| 1 | 50 | Kim |
| 1 | 50 | Kim |
| 1 | 25 | Kim |
| 1 | 25 | Kim |
| 1 | 25 | Mike |
| 2 | 4 | Kim |
| 2 | 4 | Saul |
| 2 | 4 | Saul |
| 2 | 5 | Kim |
| 2 | 5 | Kim |
需求
按id_1和id_2分组,生成新列output显示每个分组内name值的出现次数,预期输出如下:
| id_1 | id_2 | name | output |
|---|---|---|---|
| 1 | 50 | Kim | 2 |
| 1 | 50 | Kim | 2 |
| 1 | 25 | Kim | 2 |
| 1 | 25 | Kim | 2 |
| 1 | 25 | Mike | 1 |
| 2 | 4 | Kim | 1 |
| 2 | 4 | Saul | 2 |
| 2 | 4 | Saul | 2 |
| 2 | 5 | Kim | 2 |
| 2 | 5 | Kim | 2 |
问题分析
你之前尝试的代码:
df.groupby(['id_1', 'id_2']).size() .sort_values(ascending=False) .reset_index(name='count')
仅统计了每个(id_1, id_2)分组的总记录数,而非分组内每个name的出现次数,因此无法得到预期结果。
解决方案
方法一:使用transform直接添加列(推荐)
同时按id_1、id_2、name分组,通过transform将统计结果映射回原DataFrame的每一行:
df['output'] = df.groupby(['id_1', 'id_2', 'name'])['name'].transform('count')
transform('count')会计算每个分组的行数(即该name在对应(id_1, id_2)组内的出现次数),并自动匹配到原DataFrame的对应行。
方法二:先统计次数再合并
先分组统计次数,再通过merge合并回原DataFrame:
# 统计每个(id_1, id_2, name)组合的出现次数 count_df = df.groupby(['id_1', 'id_2', 'name']).size().reset_index(name='output') # 合并到原DataFrame df = df.merge(count_df, on=['id_1', 'id_2', 'name'])
两种方法均可得到符合预期的输出结果。
内容的提问来源于stack exchange,提问作者user4740374
相关产品推荐
相关产品推荐

