2017-01-24 4 views
0

私はパンダの一族の指導者から助けが必要です。 私はこのデータセットを有する:パンダは不均等な長さのグループを平均化するのに役立ちます

私は基本的にグループなどの値ができ
df1 = pd.DataFrame({ 
"phase" : ["PH1", "PH1", "PH1", "PH1", "PH1" , "PH1", "PH1"] , 
"sname" : ["CB01R", "CB01R", "CB01R", "CB01R", "CB01R", "CB01R", "CB01R"] , 
"patid" : ["PG01", "PG01","PG01", "PG02", "PG02", "PG02","PG02"] , 
"vbins" : [0., 50., 80., 0., 50., 80., 90.] , 
"vprob" : [100., 60., 0., 100., 60., 10., 0.] , 
}) 

patid phase sname vbins vprob 
0 PG01 PH1 CB01R  0 100 
1 PG01 PH1 CB01R  50  60 
2 PG01 PH1 CB01R  80  0 

patid phase sname vbins vprob 
3 PG02 PH1 CB01R  0 100 
4 PG02 PH1 CB01R  50  60 
5 PG02 PH1 CB01R  80  10 
6 PG02 PH1 CB01R  90  0 

は、所望の結果が以下のようにvbinsとvprobを平均化することです。

phase sname vbins vprob 
PH1 CB01R  0.5*(0+0) 0.5*(100+100) 
       0.5*(50+50)  0.5*(60+60) 
       0.5*(80+80)  0.5*(0+10) 
       0.5*(NaN+90)  0.5*(NaN+0) 

ここで、平均はグループを超え、NaNは等しくない長さに使用されます。私はグループを取得するためにdf1.groupby(['phase', 'sname', 'patid'])を試した後、目的の平均化を処理する関数を実装していませんでした。

+0

「NaN + 0」はあなたに何を与えるべきですか? 0またはNaN? – Psidom

+0

私に0を与えるべきです、申し訳ありません、私はそれを明確にしませんでした。 – user1301295

答えて

1
df1.groupby(
    [ 
     'phase', 'sname', 
     df1.groupby('patid').cumcount() 
    ] 
)['vbins', 'vprob'].sum()/2 

enter image description here

0

あなたはpd.pivot_table、例えば、試してみてください:

与えられた:それは


が編集うまくいくなら、私に知らせて

pd.pivot_table(data=df, index=['phase','sname'], values=['vbins','vprob'], aggfunc='mean') 

をの性質 あなたの問題は、手で別の列を追加して、pivot_tableでグループ化されるものについての参照を作成する必要があります。

+0

私は、あなたの提案の出力が私が望むものを与えなかったので、単一の値ではなく平均のベクトルを期待しています。 Out [4]: vbin vprob フェーズsname PH1 CB01R 50 47.142857 – user1301295

関連する問題