求助:用Pandas按索引标签分组DataFrame,计算各州前三人口县总和并筛选前三州
解决方法:按需求处理Pandas DataFrame
没问题,我来帮你搞定这个Pandas处理需求!咱们一步步拆解,保证每一步都明明白白:
步骤1:按州分组,提取每个州人口最多的3个县
首先,我们需要把数据按州名(STNAME)分组,然后对每个州的县,筛选出人口(POPESTIMATE)最多的3个。用groupby结合nlargest就能轻松实现:
import pandas as pd # 先模拟你的数据(实际使用时替换成你的真实DataFrame) data = { 'STNAME': ['Alabama', 'Alabama', 'Alabama', 'Alabama', 'Alabama', 'Wyoming', 'Wyoming', 'Wyoming'], 'CTYNAME': ['Autauga County', 'Baldwin County', 'Barbour County', 'Bibb County', 'Blount County', 'Sweetwater County', 'Teton County', 'Uinta County'], 'POPESTIMATE': [54660, 183193, 27341, 22861, 57373, 43593, 21297, 21102] } df = pd.DataFrame(data) # 按州分组,取每个州人口Top3的县 top3_counties = df.groupby('STNAME').apply(lambda x: x.nlargest(3, 'POPESTIMATE')).reset_index(drop=True)
解释:groupby('STNAME')将数据按州拆分,每个州对应一个子DataFrame;lambda x: x.nlargest(3, 'POPESTIMATE')对每个子DataFrame取人口最多的3行;reset_index(drop=True)是为了去掉分组后生成的多级索引,得到整洁的结果。
步骤2:计算「各州人口统计值」
接下来,对每个州的Top3县人口求和,得到你要的「各州人口统计值」:
# 按州分组求和 state_pop_total = top3_counties.groupby('STNAME')['POPESTIMATE'].sum().rename('各州人口统计值')
这里我们再次按州分组,只对POPESTIMATE列求和,并用rename给结果列起一个直观的名字。
步骤3:找出统计值最高的3个州并转成列表
最后一步,从所有州的统计值里取最大的3个,再转成列表:
# 取Top3州并转列表 top3_states = state_pop_total.nlargest(3).index.tolist() print(top3_states) # 输出示例:['Alabama', 'Wyoming'](如果只有这两个州的话)
nlargest(3)会直接返回最大的3个值及其对应的州名,我们提取它的索引(也就是州名)再转成列表即可。
更简洁的链式写法
如果你喜欢更紧凑的代码,可以把所有步骤合并成链式调用,省去中间变量:
top3_states = (df.groupby('STNAME') .apply(lambda x: x.nlargest(3, 'POPESTIMATE')['POPESTIMATE'].sum()) .nlargest(3) .index.tolist())
这个写法和分步逻辑完全一致,只是把操作连在一起,更高效省内存。
注意事项
- 如果某个州的县数量不足3个,
nlargest会自动取该州所有的县,求和逻辑依然成立,完全符合你“最多3个”的需求; - 确保你的
POPESTIMATE列是数值类型(int/float),如果是字符串的话需要先转换:df['POPESTIMATE'] = pd.to_numeric(df['POPESTIMATE'])。
内容的提问来源于stack exchange,提问作者Aniruddh Maini
相关产品推荐
相关产品推荐

