You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 15:17:25