2017-08-31 25 views
2

の外にカウントして新しい列を抽出:私はこのようなパンダのデータフレームを扱っていますパンダのデータフレームGROUPBY

 Day Hour   Prio Value 
0  1  6  Critical  1 
1  1 16  Critical  1 
2  1 17  Content  1 
3  1 17   Low  1 
6  1 19  Critical  1 
7  1 20   High  1 
8  2 10   High  1 
9  2 10   Low  2 

そして今、私は数を表す新しい列を生成しながら、デイや時間によってグループ化する必要現在の列valueに存在する列Prioの各値のだから私はこの構造を達成したい:

 Day Hour Critical Content Low High 
0  1  6   1  0 0  0 
1  1 16   1  0 0  0 
2  1 17   0  1 1  0 
6  1 19   1  0 0  0 
7  1 20   0  0 0  1 
8  2 10   0  0 2  1 

私は今、さまざまなことを試みたが、むしろうまくいっていない。私は、これらのデータフレームを集約して、他の列をDayとHourでさらに集約してさらに集約することを目標にしています。特に、優先度の中で1日あたりの割合の割合が必要です(少なくとも1つの非ゼロ値が常に存在します)。

以前の解決策では、各行を繰り返して単一の値を抽出していましたが、これはかなり遅かったです。私はデータをbokehサーバーアプリケーション内でライブで更新する必要があるので、できるだけ効率的にしておきたいと思います。たぶん、itertuplesまたはこれに類するものを使用しないで解決策がありますか?ありがとうございました!

答えて

2
df.groupby(['Day','Hour','Prio']).sum().unstack().fillna(0).astype(int) 
#   Value     
#Prio  Content Critical High Low 
#Day Hour       
#1 6   0  1 0 0 
# 16   0  1 0 0 
# 17   1  0 0 1 
# 19   0  1 0 0 
# 20   0  0 1 0 
#2 10   0  0 1 2 

必要に応じて、インデックスをさらにリセットすることができます。

+0

'unstack'はここミッシングリンクだったと私はそれがなくてもどうやって暮らすことができるのか分かりません。あなたのソリューションと 'pivot_table'は私の謙虚な従来のアプローチと比べて、完璧にうまく動作し、優れたパフォーマンスを発揮します。ありがとう! – AdmPicard

2

それともさんは​​、unstackreset_index、およびrename_axisを使用してみましょう

pd.pivot_table(df,values='Value',index=['Day','Hour'],columns=['Prio'],aggfunc='sum')\ 
    .fillna(0).astype(int) 


Out[22]: 
Prio  Content Critical High Low 
Day Hour        
1 6   0   1  0 0 
    16   0   1  0 0 
    17   1   0  0 1 
    19   0   1  0 0 
    20   0   0  1 0 
2 10   0   0  1 2 
+0

結果を「int」に変換することを検討してください。それらはカウントを表すはずです。 – DyZ

+0

私はこの解決策を試しましたが、時間をかけてテストすると、@ DYZの解でループあたり5.84ミリ秒でループあたり14.6ミリ秒を与えました – Vaishali

+0

'unstack'アプローチと同様に優れたパフォーマンスを示す' pivot_table'関数をありがとう、両方正確には、私が必要なものです。相対的な値を計算したいので、整数に変換してそれを放棄する必要はありません。 – AdmPicard

1

を試すことができます。

df.set_index(['Day','Hour','Prio'])['Value']\ 
    .unstack().fillna(0)\ 
    .astype(int).reset_index()\ 
    .rename_axis(None,1) 

出力:

Day Hour Content Critical High Low 
0 1  6  0   1  0 0 
1 1 16  0   1  0 0 
2 1 17  1   0  0 1 
3 1 19  0   1  0 0 
4 1 20  0   0  1 0 
5 2 10  0   0  1 2 
関連する問題