【问题标题】:Confidence Interval in Python dataframePython数据框中的置信区间
【发布时间】:2019-04-30 09:11:45
【问题描述】:

我正在尝试计算大型数据集中“力”列的平均值和置信区间 (95%)。我需要通过分组不同的“类”来使用 groupby 函数的结果。

当我计算平均值并将其放入新的数据框中时,它会为我提供所有行的 NaN 值。我不确定我是否走正确的路。有没有更简单的方法来做到这一点?

这是示例数据框:

df=pd.DataFrame({ 'Class': ['A1','A1','A1','A2','A3','A3'], 
                  'Force': [50,150,100,120,140,160] },
                   columns=['Class', 'Force'])

为了计算置信区间,我做的第一步是计算平均值。这是我用的:

F1_Mean = df.groupby(['Class'])['Force'].mean()

这给了我所有行的NaN 值。

【问题讨论】:

标签: python pandas confidence-interval


【解决方案1】:

正如 cmets 中所述,我无法复制您的错误,但您可以尝试检查您的数字是否存储为数字而不是字符串。使用df.info() 并确保相关列是浮点数或整数:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 6 entries, 0 to 5
Data columns (total 2 columns):
Class    6 non-null object   # <--- non-number column
Force    6 non-null int64    # <--- number (int) column
dtypes: int64(1), object(1)
memory usage: 176.0+ bytes

【讨论】:

    【解决方案2】:

    2021 年 10 月 25 日更新:@a-donda 指出,95% 应基于平均值的 1.96 X 标准差。

    import pandas as pd
    import numpy as np
    import math
    
    df=pd.DataFrame({'Class': ['A1','A1','A1','A2','A3','A3'], 
                     'Force': [50,150,100,120,140,160] },
                     columns=['Class', 'Force'])
    print(df)
    print('-'*30)
    
    stats = df.groupby(['Class'])['Force'].agg(['mean', 'count', 'std'])
    print(stats)
    print('-'*30)
    
    ci95_hi = []
    ci95_lo = []
    
    for i in stats.index:
        m, c, s = stats.loc[i]
        ci95_hi.append(m + 1.96*s/math.sqrt(c))
        ci95_lo.append(m - 1.96*s/math.sqrt(c))
    
    stats['ci95_hi'] = ci95_hi
    stats['ci95_lo'] = ci95_lo
    print(stats)
    

    输出是

      Class  Force
    0    A1     50
    1    A1    150
    2    A1    100
    3    A2    120
    4    A3    140
    5    A3    160
    ------------------------------
           mean  count        std
    Class                        
    A1      100      3  50.000000
    A2      120      1        NaN
    A3      150      2  14.142136
    ------------------------------
           mean  count        std     ci95_hi     ci95_lo
    Class                                                
    A1      100      3  50.000000  156.580326   43.419674
    A2      120      1        NaN         NaN         NaN
    A3      150      2  14.142136  169.600000  130.400000
    

    【讨论】:

    • 如此出色的答案。我希望我能奖励它。返回包含所有统计信息的 df 是一个很好的做法。干得好。
    • 所以这是我的补充:要让它返回格式化的字符串列,请添加以下内容:stats['95p_ci'] = "(" + stats['ci95_lo'].round(1).astype(str) + ', ' + stats['ci95_hi'].round(1).astype(str) + ')'
    • 95% CI 的正确乘数是 1.96,而不是 1.95。另外,请注意,这是基于二项分布的正态分布近似值,仅适用于大样本。
    • @A.Donda,你是对的。让我更新
    猜你喜欢
    • 2020-10-06
    • 2018-07-13
    • 2016-08-04
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 2017-11-02
    相关资源
    最近更新 更多