如何用Pandas统计用户蔬菜总消费量并降序排列?
Pandas按用户汇总蔬菜消费量并降序排列解决方案
问题背景
我正在使用Pandas进行数据处理,现有一个包含两列的CSV文件:
- name:姓名可重复出现
- food:取值为banana、apple、carrot、celery或potato,同一用户可多次记录同一种食物
表格示例:
| name | food |
|---|---|
| paul | carrot |
| paul | potato |
| paul | apple |
| alex | banana |
| alex | celery |
| marie | potato |
| marie | apple |
| paul | apple |
| carl | potato |
| ... | ... |
| bob | banana |
需求:生成降序列表,展示各用户的蔬菜(carrot、potato、celery)总消费量,包含姓名和对应总量,按总量从多到少排序。
当前尝试代码:
import pandas as pd df = pd.read_csv('foodcounter.csv') s = df['name'].groupby(df['food']).value_counts()[['carrot','potato','celery']] print(s.to_string())
当前输出(按食物分类的用户消费量):
| food | name | count |
|---|---|---|
| carrot | paul | 43 |
| alex | 32 | |
| carl | 13 | |
| ... | ... | |
| celery | Paul | 12 |
| alex | 3 | |
| marie | 1 | |
| ... | ... | |
| potato | paul | 33 |
| marie | 23 | |
| alex | 14 |
期望输出(按用户汇总蔬菜总量并降序):
| name | count |
|---|---|
| Paul | 88 |
| alex | 77 |
| marie | 66 |
| ... | ... |
| carl | 16 |
| bob | 5 |
| john | 1 |
解决代码及说明
你需要先筛选蔬菜记录,再按用户分组统计总量,最后降序排序。完整代码如下:
import pandas as pd # 读取CSV文件 df = pd.read_csv('foodcounter.csv') # 定义蔬菜类别列表 vegetables = ['carrot', 'potato', 'celery'] # 筛选蔬菜数据 → 按姓名分组统计 → 转换为DataFrame → 降序排序 result = df[df['food'].isin(vegetables)] \ .groupby('name') \ .size() \ .reset_index(name='count') \ .sort_values(by='count', ascending=False) # 输出结果(隐藏索引列) print(result.to_string(index=False))
代码细节解释
- 筛选蔬菜记录:
df[df['food'].isin(vegetables)]仅保留食物属于蔬菜列表的行,排除水果类数据。 - 分组统计:
.groupby('name').size()按姓名分组,统计每组的行数,即该用户的蔬菜总消费量。 - 格式转换:
.reset_index(name='count')将分组后的Series转换为DataFrame,并将统计列命名为count,匹配期望的输出结构。 - 降序排序:
.sort_values(by='count', ascending=False)按消费量从高到低排列结果。 - 输出优化:
print(result.to_string(index=False))隐藏默认的索引列,让输出格式与期望完全一致。
内容的提问来源于stack exchange,提问作者stackuser.m46i3
相关产品推荐
相关产品推荐

