2015-04-17 16 views
0

У меня есть несколько вопросов о том, как использовать кадры данных pandas. Я хотел бы сгруппировать таблицу двумя способами.Группировка кадров данных панд по временным интервалам

Во-первых, я хотел бы сгруппировать записи в определенные промежутки времени. Предположим, я хочу сгруппировать следующие записи в 3-минутные интервалы. Как мне это сделать ?

Во-вторых, я хотел бы определить определенный порядок строк в 4-м столбце как одно событие (от одного «вознаграждения» до следующего). Затем я хотел бы сгруппировать 5 последующих событий вместе.

В этом смысл? Кто-нибудь может мне помочь? Я думаю, если кто-нибудь знает панды, это будет кусок пирога.

Большое спасибо и все самое лучшее.

 
4914 2015-03-31 19:56:34 trialIdle 1  0 0 
4915 2015-03-31 19:56:36 trialIdle 1  0 0 
4916 2015-03-31 19:56:39 trialIdle 1  0 0 
4917 2015-03-31 19:56:39 trialIdle 1  1 0 
4918 2015-03-31 19:56:51 trialIdle 1  0 0 
4919 2015-03-31 19:56:51  reward 0  0 0 
4920 2015-03-31 19:56:58 trialTimout 1  1 0 
4921 2015-03-31 19:57:06 trialIdle 1  1 0 
4922 2015-03-31 19:57:09 trialIdle 1  1 0 
4923 2015-03-31 19:57:09 trialIdle 1  1 0 
4924 2015-03-31 19:57:12 trialIdle 1  1 0 
4925 2015-03-31 19:57:12 trialIdle 1  1 0 
4926 2015-03-31 19:57:12  reward 0  0 0 
4927 2015-03-31 19:57:16 trialTimout 1  1 0 
4928 2015-03-31 19:57:31 trialIdle 1  1 0 
4929 2015-03-31 19:57:44 trialIdle 1  0 0 
4930 2015-03-31 19:57:45 trialIdle 1  0 0 
4931 2015-03-31 19:58:54 trialIdle 1  0 0 
4932 2015-03-31 19:59:56 trialIdle 1  1 0 
4933 2015-03-31 19:59:56  reward 0  0 0 
4934 2015-03-31 19:59:57 trialTimout 1  1 0 
4935 2015-03-31 20:00:02 trialTimout 1  0 0 
4936 2015-03-31 20:00:05 trialIdle 1  0 0 
4937 2015-03-31 20:00:18 trialIdle 1  0 0 
4938 2015-03-31 20:00:19 trialIdle 1  1 0 
4939 2015-03-31 20:00:40 trialIdle 1  1 0 
4940 2015-03-31 20:00:51 trialIdle 1  0 0 
4941 2015-03-31 20:00:51  reward 0  0 0 
+0

группировки на временные интервалы можно сделать с помощью частоты дискретизации: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.resample. html – aensm

ответ

1

Немного сложно узнать, как ваши данные структурированы из дампа, который вы предоставили. Я предполагаю, что информация о дате и времени представляет собой один столбец в вашем DataFrame, который хранится как серия временных меток панд. Если нет, вам нужно будет ввести его в этот формат. Для меня это в колонке 1 ...

In [15]: print(df.head()) 
         1   2 3 4 5 
0            
4914 2015-03-31 19:56:34 trialIdle 1 0 0 
4915 2015-03-31 19:56:36 trialIdle 1 0 0 
4916 2015-03-31 19:56:39 trialIdle 1 0 0 
4917 2015-03-31 19:56:39 trialIdle 1 1 0 
4918 2015-03-31 19:56:51 trialIdle 1 0 0 

Далее мы делаем индекс временной отметки ...

In [16]: df.index = pd.DatetimeIndex(df[1]) 

[Редактировать] сделать новый столбец для каждой категории в колонке 2

In [17]: for col in df[2].unique(): 
    ....:  df[col] = (df[2] == col).astype(int) 

Тогда мы ресэмплировать

In [18]: dfrs = df.resample('3min', how=sum) 

И давайте посмотрим, что мы получили

In [19]: print(dfrs) 
         3 4 5 trialIdle reward trialTimout 
2015-03-31 19:54:00 6 2 0   5  1   1 
2015-03-31 19:57:00 12 9 0   10  2   2 
2015-03-31 20:00:00 6 2 0   5  1   1 

[Редактировать] С точки зрения группировки событий вместе - следующий код смотрит на награду линии и все последующие строки вплоть до (и исключая) следующую награду линия. Я назвал эту группу вознаграждений (rwg).

df['rwg'] = np.nan 
df.loc[df[2]=='reward', 'rwg'] = range(1, sum(df[2]=='reward')+1) 
df['rwg'] = df['rwg'].ffill() # bfill() if you want to group the other way 
df['rwg'] = df['rwg'].fillna(0) # the initial group without a preceding reward 
dfrwg = df.groupby('rwg').sum() 
print(dfrwg) 

Примечания: если вы хотите, чтобы сгруппировать строки до и включая премиальную линию, используйте bfill(), а не ffill() выше.

В ffill() подход дает

In [119]: print(dfrwg) 
    3 4 5 trialIdle reward trialTimout 
rwg           
0 5 1 0   5  0   0 
1 6 6 0   5  1   1 
2 6 3 0   5  1   1 
3 7 3 0   5  1   2 
4 0 0 0   0  1   0 
+0

Эй, Марк, спасибо, это было то, что я искал. Единственная проблема заключается в том, что я хочу также суммировать строки в этом интервале. Так что, если в этом интервале было 10 "пробных игр". Это возможно? Кроме того, есть ли у вас решение для второй части вопроса? Большое спасибо до сих пор. – maggu

+0

Хорошо - добавим предложение - дай мне пару минут –

+0

Не совсем уверен, как вы хотели сгруппировать события, но с тем, чтобы вы могли легко адаптироваться. –

Смежные вопросы