基于Python DataFrame按acat分组统计data频次并计算均值与偏度
解决方法:按acat分组统计频次并计算均值与偏度
针对你需要按每个唯一acat值,统计data在1-5类别中的出现次数(即bins),再计算bins的均值和偏度的需求,我可以用Pandas结合Scipy来实现,下面用你的示例数据一步步演示:
1. 导入依赖库并准备示例数据
首先导入需要的工具库,然后定义你的示例DataFrame:
import pandas as pd from scipy.stats import skew # 示例数据 df = pd.DataFrame({'acat':[1,1,2,3,1,3], 'data':[1,1,2,1,3,1]})
2. 分组统计每个acat的data类别频次
我们需要确保1-5每个类别都被统计到(哪怕出现次数为0),可以通过分组后的值计数、转置填充缺失值,再重排类别顺序来实现:
# 按acat分组统计data各值的出现次数,转置后填充缺失类别为0,并重排为1-5的顺序 counts_df = df.groupby('acat')['data'].value_counts()\ .unstack(fill_value=0)\ .reindex(columns=[1,2,3,4,5], fill_value=0)
这一步执行后,counts_df就是每个acat对应的bins矩阵:
1 2 3 4 5 acat 1 2 0 1 0 0 2 0 1 0 0 0 3 2 0 0 0 0
3. 计算bins的均值与偏度
接下来对每个acat的bins计算均值和偏度:
# 计算均值:bins的总和除以类别数量(5) counts_df['mean'] = counts_df.sum(axis=1) / 5 # 计算偏度:对每行的1-5列(即bins)应用偏度计算函数 counts_df['skewness'] = counts_df[[1,2,3,4,5]].apply(skew, axis=1)
最终结果
执行完上述代码后,counts_df会包含每个acat的bins、均值和偏度:
1 2 3 4 5 mean skewness acat 1 2 0 1 0 0 0.6 0.577350 2 0 1 0 0 0 0.2 0.000000 3 2 0 0 0 0 0.4 1.732051
关键步骤解释
groupby('acat')['data'].value_counts():按acat分组,统计每个分组内data各值的出现次数。unstack(fill_value=0):将行形式的统计结果转为列形式,缺失的data类别(比如某个acat没有出现4、5)填充为0。reindex(columns=[1,2,3,4,5]):强制列顺序为1到5,避免因某些分组缺失类别导致列顺序混乱。skew函数:来自scipy.stats,用于计算一组数据的偏度,衡量数据分布的不对称程度。
内容的提问来源于stack exchange,提问作者ladidalimey
相关产品推荐
相关产品推荐

