R语言DataFrame条件平均、分组与排序实现问题
解决方案
1. 定义年份区间标签
先给每个年份匹配对应的区间分组,用pd.cut快速实现:
import pandas as pd # 定义年份区间边界和对应标签 year_bins = [1979, 1990, 2001, 2007, 2020] year_labels = ['1980-1990', '1991-2001', '2002-2007', '2008-2020'] # 为原DataFrame添加区间标签列 df['year_period'] = pd.cut(df['fyear'], bins=year_bins, labels=year_labels, include_lowest=True)
2. 计算各区间及全周期的行业均值
分别计算分区间和全周期的行业指标均值,再合并结果:
# 计算分区间的行业指标均值 period_means = df.groupby(['newname', 'year_period'])[['aqcflow', 'capxflow']].mean().reset_index() # 计算全周期的行业指标均值,添加统一标签 full_period_means = df.groupby('newname')[['aqcflow', 'capxflow']].mean().reset_index() full_period_means['year_period'] = '全周期' # 合并两类均值数据 all_means = pd.concat([period_means, full_period_means], ignore_index=True)
3. 转换为宽表结构
通过pivot将长表转成宽表,调整列名提升可读性:
# 转宽表:行业为行,(指标, 区间)为列 wide_df = all_means.pivot(index='newname', columns='year_period', values=['aqcflow', 'capxflow']) # 格式化列名,比如"aqcflow_1980-1990" wide_df.columns = ['_'.join(col) for col in wide_df.columns] wide_df = wide_df.reset_index()
4. 按总平均值降序排序
以全周期的指标均值作为总平均值,进行排序:
# 计算各行业的总平均值(这里取全周期两个指标的均值,可按需调整) wide_df['total_mean'] = wide_df[['aqcflow_全周期', 'capxflow_全周期']].mean(axis=1) # 按总平均值降序排列 wide_df_sorted = wide_df.sort_values(by='total_mean', ascending=False)
常见异常排查
- 如果出现分组错误:检查
year_bins的边界是否覆盖所有年份,include_lowest=True确保1980年被正确划入第一个区间 - 如果出现缺失值:计算均值时可添加
dropna=True(默认已开启),或根据业务需求用fillna(0)填充缺失值 - 如果pivot报错重复值:检查是否存在同一行业同一区间的重复数据,可先对原数据去重或用
groupby聚合时指定更严谨的规则
内容的提问来源于stack exchange,提问作者Ayoze Alfageme
相关产品推荐
相关产品推荐

