2016-12-09 3 views
1

У меня есть кадр данных, который выглядит как этотПанда: Последовательные значения нулевой

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 

Я хочу, чтобы сгруппировать по последовательным значениям (0 в данном случае) и имеет выход как

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 
Смежные вопросы