基于Pandas优化多年度各县数据占比统计代码的技术问询
问题描述
有一份包含5年数据的数据集,需要生成一个DataFrame完成以下统计:
- 每年各County中
Column 1值>10的行占比 - 各County在当年数据集中的重要性(即行数占当年总行数的比例)
- 最终按年度取平均值
已实现单年度(2018年)的逻辑,代码如下:
df_2018_1 = df[(df.Year=='2018')] df_2018_2 = df[(df.column_1 > 10) & (df.Year=='2018')] df_2018_cur = pd.DataFrame() df_2018_cur['Column 1 > 10'] = df_2018_2.County.value_counts()/df_2018_1.County.value_counts()*100 # Percent of submissions by county out of all submissions (county importance). df_2018_cur['PCT of State'] = df_2018_1.County.value_counts()/len(df_2018_1)*100 # Repeat for remaining years, then average across dataframes.
希望获得更简洁的代码方案,疑惑是否可借助groupby实现。
简洁解决方案
完全可以通过groupby结合聚合操作实现,无需逐年度重复代码,完整方案如下:
import pandas as pd # 1. 新增辅助列,标记Column 1是否大于10 df['col1_gt10'] = df['column_1'] > 10 # 2. 按年度+County分组,统计每组总行数和符合条件的行数 grouped = df.groupby(['Year', 'County']).agg( total_rows=('col1_gt10', 'count'), gt10_rows=('col1_gt10', 'sum') ) # 3. 计算两个百分比指标 grouped['Column 1 > 10'] = (grouped['gt10_rows'] / grouped['total_rows']) * 100 # 先统计每年总行数,再计算各County行数占当年总行数的比例 year_total = df.groupby('Year')['County'].count() grouped['PCT of State'] = (grouped['total_rows'] / grouped.index.get_level_values('Year').map(year_total)) * 100 # 4. 按County取所有年度的指标平均值 result_avg = grouped.groupby('County').mean().reset_index() # 若需要保留年度维度的原始统计结果,直接使用grouped即可;若要年度均值则用result_avg print(result_avg)
关键逻辑说明
groupby(['Year', 'County']).agg(...):一次性完成跨年度的分组统计,count获取每组总行数,sum统计col1_gt10为True的行数(布尔值在求和时等价于1/0)year_total:先计算每年的总行数,再通过索引映射快速计算各County的年度占比groupby('County').mean():直接聚合所有年度的指标值,得到各County的平均占比,无需手动合并多个年度DataFrame
内容的提问来源于stack exchange,提问作者LabRat01010
相关产品推荐
相关产品推荐

