2017-09-25 14 views
1

多くの列を持つパンダデータフレーム(df)があります。わかりやすくするために、私はここにダミーデータを含む3つの列を掲示しています。パンダのデータフレームのグループ化

Timestamp Source Length 
0   1    5 
1   1    5 
2   1    5 
3   2    5 
4   2    5 
5   3    5 
6   1    5 
7   3    5 
8   2    5 
9   1    5 

まず、私はdfのインデックスとしてタイムスタンプを設定します。

index = pd.DatetimeIndex(data[data.columns[1]]*10**9) # Convert timestamp 
df = df.set_index(index) # Set Timestamp as index 

次に私は5秒ビンにグループ化データをGROUPBYpd.TimeGrouper機能を使用して、次のように各ビンの累積長さを計算することができる:

df_length = data[data.columns[5]].groupby(pd.TimeGrouper('5S')).sum() 

だからdf_lengthデータフレームは次のようになります。

Timestamp  Length 
0    25 
5    25 

今問題がある:「私は5秒の同じビンを取得したいのですが、アリは次の形式で別々の列内の各ソース(1,2および3)の累積長さを計算するために:

Timestamp 1  2  3 
0   15 10 0 
5   10 5  10 

私はそれを得るためにいくつかの条件でdf.groupbyを使うことができると思います。しかし、混乱し、疲れて、今:(

はパンダの機能を使用してソリューションを感謝

+0

あなたの「ダミーデータ」には5列がないので、あなたの 'df_length'関数は機能しません – asongtoruin

答えて

1

あなたはMultiIndex DataFrameためGROUPBY Sourceのための新しい列を追加して、列に対してMultiIndexunstack最後のレベルによって再構築することができます。

print (df[df.columns[2]].groupby([pd.TimeGrouper('5S'), df['Source']]).sum()) 
Timestamp   Source 
1970-01-01 00:00:00 1   15 
        2   10 
1970-01-01 00:00:05 1   10 
        2   5 
        3   10 
Name: Length, dtype: int64 

df1 = df[df.columns[2]].groupby([pd.TimeGrouper('5S'), df['Source']]) 
         .sum() 
         .unstack(fill_value=0) 
print (df1) 
Source    1 2 3 
Timestamp      
1970-01-01 00:00:00 15 10 0 
1970-01-01 00:00:05 10 5 10 
+1

私はピボットテーブルを使うことを提案しようとしていましたが、エル。よくやった! – asongtoruin

+0

ありがとうございます。できます!しかし、コードを説明してください。私のデータで他の同様の種類のグループ化の問題に直面する可能性があるため、コードがどのように機能するか説明してください。 –

関連する問題