Pandas分组求最值报错:'list'对象无'max'属性及需求实现
问题解决:Pandas 获取候选人年度最高得票与总得票
错误原因
你写的代码DF.loc[DF.groupby(['name', 'election_year'],['votes'].max())]语法逻辑错误:groupby的第二个参数是轴参数(0/1),你把列名列表['votes']直接跟在分组键后面并链式调用.max(),相当于对列表['votes']调用.max(),自然会触发AttributeError: 'list' object has no attribute 'max'。
正确实现步骤
先构造你的样例数据用于测试:
import pandas as pd data = { 'votes': [20, 30, 40, 20, 40, 40], 'name': ['Mark Smith', 'Mark Smith', 'Mark Smith', 'John Key', 'John Key', 'John Key'], 'election_year': [2020, 2020, 2022, 2000, 2000, 2022] } DF = pd.DataFrame(data)
1. 计算每位候选人各年度最高得票数
按name和election_year分组,对votes字段取最大值:
yearly_max = DF.groupby(['name', 'election_year'])['votes'].max().reset_index()
输出结果:
| name | election_year | votes | |
|---|---|---|---|
| 0 | John Key | 2000 | 40 |
| 1 | John Key | 2022 | 40 |
| 2 | Mark Smith | 2020 | 30 |
| 3 | Mark Smith | 2022 | 40 |
2. 计算每位候选人总得票数
按name分组对votes字段求和:
total_votes = DF.groupby('name')['votes'].sum().reset_index().rename(columns={'votes': 'total_votes'})
输出结果:
| name | total_votes | |
|---|---|---|
| 0 | John Key | 100 |
| 1 | Mark Smith | 90 |
3. 合并结果得到最终数据
用merge将年度最高得票与总得票关联:
final_result = pd.merge(yearly_max, total_votes, on='name')
最终输出:
| name | election_year | votes | total_votes | |
|---|---|---|---|---|
| 0 | John Key | 2000 | 40 | 100 |
| 1 | John Key | 2022 | 40 | 100 |
| 2 | Mark Smith | 2020 | 30 | 90 |
| 3 | Mark Smith | 2022 | 40 | 90 |
简化一步写法
也可以用groupby的agg方法结合transform直接处理:
DF['total_votes'] = DF.groupby('name')['votes'].transform('sum') final_result = DF.groupby(['name', 'election_year']).agg( votes_max=('votes', 'max'), total_votes=('total_votes', 'first') ).reset_index()
结果与上述一致。
内容的提问来源于stack exchange,提问作者user19463181
相关产品推荐
相关产品推荐

