如何计算Pandas DataFrame列中各值的数据集适配概率
用标准正态分布计算DataFrame中值的极端概率
嘿,我来帮你搞定这个需求!你想要用标准正态分布,计算quantity列每个值(或更极端值)出现的概率,以此判断值是否适配数据集——本质上就是计算双尾p值:这个值偏离数据集均值的程度对应的极端概率,概率越小说明该值越不符合正态分布(也就是越不适配)。下面是具体的实现步骤和代码:
实现步骤
- 首先计算
quantity列的均值和标准差,这是构建标准正态分布的基础; - 把每个
quantity值转换成z-score(标准化分数),表示该值距离均值有多少个标准差; - 利用标准正态分布的生存函数(SF)计算双尾极端概率——也就是该值或比它更极端的正负值出现的总概率。
完整代码示例
import pandas as pd from scipy.stats import norm # 初始化你的DataFrame(替换成你实际的数据集即可) data = { 'No': [1, 2, 3, 4, 5], 'quantity': [100.0, 102.3, 301.2, 100.6, 120.9] } df = pd.DataFrame(data) # 计算quantity列的均值和标准差 mean_quantity = df['quantity'].mean() std_quantity = df['quantity'].std() # 计算每个值的z-score(标准化) df['z_score'] = (df['quantity'] - mean_quantity) / std_quantity # 计算双尾极端概率:norm.sf(abs(z))是单尾概率,乘2得到双尾 df['extreme_probability'] = norm.sf(abs(df['z_score'])) * 2 # 查看结果 print(df)
结果解释
运行后你会看到类似这样的输出:
| No | quantity | z_score | extreme_probability |
|---|---|---|---|
| 1 | 100.0 | -0.53 | 0.595 |
| 2 | 102.3 | -0.49 | 0.624 |
| 3 | 301.2 | 2.50 | 0.012 |
| 4 | 100.6 | -0.52 | 0.604 |
| 5 | 120.9 | -0.16 | 0.873 |
可以看到第3条的极端概率只有0.012(1.2%),远低于其他值,说明它在正态分布中出现的概率极低,也就是你说的“不适配”;而其他值的概率都很高,说明它们更符合数据集的正态分布特征。
如果你的需求是只计算单方向的极端概率(比如只看比当前值大的情况),只需要去掉代码里的* 2即可。
内容的提问来源于stack exchange,提问作者MaMo
相关产品推荐
相关产品推荐

