2017-10-29 2 views
2

私は、電力システムの時系列データを分析していますに応じて時系列データをGROUPBY、と私は、ある閾値を超えた連続したデータポイントを見つけようとしています。パンダは、関数の結果

私は現在、これを行うには、手動で行でExcelの数式列を使用していますが、私は、これはGROUPBY機能Pythonのパンダで行うことができることを実現し、より効率的な方法を検索しようとしていますIとして。限り私が読んだとして、GROUPBY機能のみのグループの行として、彼らは同じラベルを持っている場合は

、。私がしたいのは、value => 3であるかどうかを調べるgroupbyに特定の関数を渡し、その値をグループ化し、しきい値=> 3を破る開始時刻と終了時刻でインデックス付けすることです。

入力:

+-------+---------+------+ 
| Index | Time | Value| 
+-------+---------+------+ 
|  0 | 00:00:01| 3 | 
|  1 | 00:00:02| 4 | 
|  2 | 00:00:03| 5 | 
|  3 | 00:00:04| 2 | 
|  4 | 00:00:05| 6 | 
|  5 | 00:00:06| 7 | 
|  6 | 00:00:07| 1 | 
|  7 | 00:00:08| 9 | 
+-------+---------+------+ 

出力:

+-------+-----------+----------+--------+ 
| Index | TimeStart | TimeEnd | Value | 
+-------+-----------+----------+--------+ 
|  0 | 00:00:01 | 00:00:03 | 3,4,5 | 
|  1 | 00:00:05 | 00:00:06 | 6,7 | 
|  2 | 00:00:08 | 00:00:08 | 9  | 
+-------+-----------+----------+--------+ 

答えて

2
  • CRE未満3
  • 累積和マスクを作成します。グループここ以上3
  • フィルタマスクによってdf、次いでgroupby
  • 使用aggは列

mask = df.Value.lt(3) 
grp = mask.cumsum() 

d1 = df[~mask].groupby(grp[~mask]).agg(dict(
    Time=['first', 'last'], 
    Value=lambda x: ','.join(map(str, x)) 
)) 

d1.columns = ['TimeStart', 'TimeEnd', 'Value'] 

d1 

     TimeStart TimeEnd Value 
Value       
0  00:00:01 00:00:03 3,4,5 
1  00:00:05 00:00:06 6,7 
2  00:00:08 00:00:08  9 
+0

サーこの名前を変更一度

  • でいくつかの機能を渡すことに等しい食べ私はそれがより多くの票を得ることを望むスーパーです。 – Dark

  • +0

    すごくありがとう!私はcumsumやマスクのような、あなたが使用した関数を認識していません。これは私が現在Pythonで知っている知識ではありません。これらをより深く掘り下げます。ありがとうございました。 –