如何用Pandas生成fac-year-period长格式频率表并计算统计量?
生成长格式三维频率表及统计量计算
1. 创建DataFrame
先构造数据集并转为DataFrame:
import pandas as pd data = {'key': [1,2,3,4,5,6,7,8,9,10], 'year': ['2020', '2020', '2021','2021','2020','2020','2021','2021','2022','2022'], 'period': [1,2,1,2,1,2,1,2,1,2], 'fac':['51000','51000','61000','61000','51000','61000','61000','61000','61000','61000'] } df = pd.DataFrame(data)
2. 生成长格式频率表
方法一:直接分组计数(推荐)
通过groupby按fac、year、period分组统计数量,重置索引后得到标准长格式:
freq_table = df.groupby(['fac', 'year', 'period']).size().reset_index(name='count') print(freq_table)
输出结果:
fac year period count 0 51000 2020 1 2 1 51000 2020 2 1 2 61000 2020 2 1 3 61000 2021 1 2 4 61000 2021 2 2 5 61000 2022 1 1 6 61000 2022 2 1
方法二:从crosstab转换
如果已经用pd.crosstab得到宽格式结果,可以通过melt转长格式,再过滤掉计数为0的行:
cross = pd.crosstab([df['fac'], df['year']], df['period']) freq_table_from_cross = cross.reset_index().melt(id_vars=['fac', 'year'], var_name='period', value_name='count') freq_table_from_cross = freq_table_from_cross[freq_table_from_cross['count'] > 0] print(freq_table_from_cross)
3. 计算统计量
整体统计(全量数据)
计算count的总和、均值、标准差,以及上控制限(UCL=均值+3×标准差)、下控制限(LCL=均值-3×标准差):
# 基础统计量 stats = freq_table['count'].agg(['sum', 'mean', 'std']).reset_index(name='value') stats.columns = ['statistic', 'value'] # 计算UCL和LCL mean_val = stats.loc[stats['statistic'] == 'mean', 'value'].iloc[0] std_val = stats.loc[stats['statistic'] == 'std', 'value'].iloc[0] stats = pd.concat([ stats, pd.DataFrame([{'statistic': 'UCL', 'value': mean_val + 3*std_val}, {'statistic': 'LCL', 'value': mean_val - 3*std_val}]) ], ignore_index=True) print(stats)
输出:
statistic value 0 sum 10.000000 1 mean 1.428571 2 std 0.534522 3 UCL 3.032138 4 LCL -0.174996
按fac分组统计
如果需要按fac维度分别计算统计量:
grouped_stats = freq_table.groupby('fac')['count'].agg(['sum', 'mean', 'std']).reset_index() grouped_stats['UCL'] = grouped_stats['mean'] + 3 * grouped_stats['std'] grouped_stats['LCL'] = grouped_stats['mean'] - 3 * grouped_stats['std'] print(grouped_stats)
输出:
fac sum mean std UCL LCL 0 51000 3 1.500000 0.707107 3.621320 -0.621320 1 61000 7 1.400000 0.547723 3.043169 -0.243169
内容的提问来源于stack exchange,提问作者PythonNewbBron
相关产品推荐
相关产品推荐

