大規模なデータセットの「力」列の平均と信頼区間(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
値が得られました。
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.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