2017-07-21 7 views
1

私はこの挑戦を解決するためにgroupbyをどのように使うことができるのか理解できない。ほとんどのgroupbyの例は明らかに、 - 連続値。パンダのデータを集約して集計するが、列内の非連続値間をスライスする

Timestamp 'Signal' 'Value 
00:00:00  1  12 
00:00:01  1  12.2 
00:00:02  1  2.1 
00:00:03  0  1.1 
00:00:04  1  6.2 
00:00:05  1  1.0 
00:00:06  0  4.4 
00:00:07  0  1.6 

信号が1であるので、私は、私は、その後の最後の新しい合計/でやり直すしたいのですが、別のケースでは、最初の3行の合計を最後の値を取るとしたいのですが最後の2行、信号があるので、1

したがって、このような何か:事前に

Timestamp Signal Value Sum Last 
00:00:00  1 12  
00:00:01  1 12.2 
00:00:02  1 2.1 26.3 2.1 
00:00:03  0 1.1 
00:00:04  1 6.2 
00:00:05  1 1.0 7.2 1.0 
00:00:06  0 4.4 
00:00:07  0 1.6 

ありがとう!

答えて

1

あなたが最初shiftだけシフトコラムAcumsumによって作成されたSeriesが必要になります。

a = df['Signal'].ne(df['Signal'].shift()).cumsum() 
print (a) 
0 1 
1 1 
2 1 
3 2 
4 3 
5 3 
6 4 
7 4 
Name: Signal, dtype: int32 

その後値が0False秒からからに変換され、列Signalと連鎖しduplicatedによって値のためにマスクを取得1True秒:

m = ~a.duplicated(keep='last') & df['Signal'] 
print (m) 
0 False 
1 False 
2  True 
3 False 
4 False 
5  True 
6 False 
7 False 
Name: Signal, dtype: bool 

最終012シリーズによってとtransformsumと最後whereNaN秒を追加します。

df['Sum'] = df.groupby(a)['Value'].transform('sum') 
df['Last'] = df['Value'] 
df[['Sum','Last']] = df[['Sum','Last']].where(m) 
print (df) 
    Timestamp Signal Value Sum Last 
0 00:00:00  1 12.0 NaN NaN 
1 00:00:01  1 12.2 NaN NaN 
2 00:00:02  1 2.1 26.3 2.1 
3 00:00:03  0 1.1 NaN NaN 
4 00:00:04  1 6.2 NaN NaN 
5 00:00:05  1 1.0 7.2 1.0 
6 00:00:03  0 4.4 NaN NaN 
7 00:00:03  0 1.6 NaN NaN 
+0

うわー、驚くほど速いです。どうもありがとう! – EnemyBagJones

関連する問題