2016-12-09 1 views
1

の連続した値が、私は(この場合は0)の連続した値でグループ化したいこのパンダ:ゼロ

Timestamp      Speed 
2014-10-10 00:10:10   112 
2014-10-10 00:10:13   34 
2014-10-10 00:10:17   0 
2014-10-10 00:10:20   0 
2014-10-10 00:10:45   0 
2014-10-10 00:10:56   3 
2014-10-10 00:11:06   0 
2014-10-10 00:11:09   0 
2014-10-10 00:11:14   11 

のように見えるデータフレームを持っていると

start_time    end_time    number 
2014-10-10 00:10:17 2014-10-10 00:10:45  3 
2014-10-10 00:11:06 2014-10-10 00:11:09  2 
+0

私は 'csv'オブジェクトで動作するソリューションを持っている - あなたは、データフレームが必要なのでしょうか?そうするなら、 'window'関数を使って行全体にスパンを生成する必要があります。 – Chinny84

答えて

0

のような出力を持っています.groupby()を使用して、隣接する値が変更されているかどうか(つまりdf["Speed"] != df["Speed"].shift())を確認してから、それらのブロックの速度が0であるかどうかを確認できます。最終的にDataFrameを再構成するより良い方法があるかもしれませんが、結果をリストに投げて、最後に再組み立てしました。

あなたのテーブルはpd.read_clipboard()でうまく読まれなかったので、私は時間がありましたが、実際のデータと同じように動作するはずです。

In [113]: df 
Out[113]: 
      Speed 
Timestamp 
00:10:10  112 
00:10:13  34 
00:10:17  0 
00:10:20  0 
00:10:45  0 
00:10:56  3 
00:11:06  0 
00:11:09  0 
00:11:14  11 

In [114]: l = [] 

In [115]: for k, v in df.groupby((df["Speed"] != df["Speed"].shift()).cumsum()): 
    ...:  if v["Speed"].iloc[0] == 0: 
    ...:   l.append({'start_time': v.index.min(), 'end_time': v.index.max(), 'number': len(v)}) 
    ...: pd.DataFrame(l, columns=['start_time', 'end_time', 'number']) 
    ...: 
Out[115]: 
    start_time end_time number 
0 00:10:17 00:10:45  3 
1 00:11:06 00:11:09  2 
0

ここだ非ループの実装

s = (((df['speed'] == 0) & (df['speed'].shift(1) == 0)) | ((df['speed'] == 0) & (df['speed'].shift(-1) == 0))) * 1 
s1 = s.diff() 
group_labels = s1[s1 == 1].cumsum() 
s_nan = s.replace(1, np.nan) 
df_copy = df.copy() 
df_copy['label'] = s_nan.combine_first(group_labels).fillna(method='ffill').replace(0, np.nan) 
df_copy = df_copy.groupby('label')['timestamp'].agg({'start_time':'first', 'end_time':'last', 'number':'size'}) 
df_copy = df_copy[['start_time', 'end_time', 'number']].reset_index(drop=True) 

df_copy 

      start_time    end_time number 
0 2014-10-10 00:10:17 2014-10-10 00:10:45  3 
1 2014-10-10 00:11:06 2014-10-10 00:11:09  2