Доверительный интервал в фрейме данных Python - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь вычислить среднее и доверительный интервал (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 значения для всех строк.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018
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
0 голосов
/ 28 ноября 2018

Как уже упоминалось в комментариях, я не смог продублировать вашу ошибку, но вы можете попробовать проверить, что ваши числа хранятся как числа, а не как строки.используйте df.info() и убедитесь, что соответствующие столбцы имеют тип float или int:

<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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...