2014-09-23 4 views
0

У меня есть два dataframes. DF1 содержит:Pandas groupby временные интервалы

Пользователь | Временной интервал

User01 | [01/01/2014 08:12:00, 01/01/2014 08:13:43]

User02 | [01/03/2014 7:21:44, 01/04/2014 1:07:01]

DF 2 содержит события:

пользователя | Время | Значение

User01 | 01/03/2014 04:11:00 | 9

User01 | 01/01/2014 08:10:00 | 12

User02 | 01/03/2014 09:11:00 | 3

User02 | 01/02/2014 011: 10: 00 | 21

Я хочу добавить 3 столбца в DF1, содержащий среднее, стандартное отклонение и максимальные значения для каждого пользователя в течение временного интервала, в зависимости от событий в DF2.

Таким образом, окончательный результат должен выглядеть следующим образом:

пользователя | Временной интервал | Среднее | Макс | StDev

User01 | [01/01/2014 08:12:00, 01/01/2014 08:13:43] | NaN | NaN | Nan

User02 | [01/03/2014 07:21:44, 01/04/2014 01:07:01] | 3 | 3 | 0

Что такое эффективный способ сделать это, если мои столы большие? Есть ли какая-то функция «groupby» для временных интервалов, которые основаны на другом кадре данных?

Код:

import pandas as pd 

DF1 = pd.DataFrame({'User' : pd.Series(["User01", "User02"], index=['1', '2']), 'Time start' : pd.Series(["01/01/2014 08:12:00", "01/03/2014 07:21:44"], index=['1', '2']),'Time end' : pd.Series(["01/01/2014 08:13:43", "01/04/2014 01:07:01"], index=['1', '2'])}) 

DF2 = pd.DataFrame({'User' : pd.Series(["User01","User01","User02", "User02"], index=['1', '2','3','4']), 'Time' : pd.Series(["01/03/2014 04:11:00", "01/01/2014 08:10:00","01/03/2014 09:11:00","01/02/2014 011:10:00"], index=['1', '2','3', '4']),'Value' : pd.Series([9,12,3,21], index=['1', '2','3','4'])}) 

DF3 = pd.DataFrame({'User' : pd.Series(["User01", "User02"], index=['1', '2']), 'Time start' : pd.Series(["01/01/2014 08:12:00", "01/03/2014 07:21:44"], index=['1', '2']),'Time end' : pd.Series(["01/01/2014 08:13:43", "01/04/2014 01:07:01"], index=['1', '2']),'Mean' : pd.Series(["Nan", 3], index=['1', '2']),'Max' : pd.Series(["Nan", 3], index=['1', '2']),'StDev' : pd.Series(["Nan", 0], index=['1', '2'])}) 
+1

Это полезно иметь копируемые pasteable примеры. Также опубликуйте, как должно выглядеть ваше ожидаемое решение с примерами, которые вы дали. Это можно сделать, разделив столбец «Интервал времени» на два, низкий и высокий, а затем используя что-то вроде 'between_time' на втором фреймворке данных. – TomAugspurger

+0

Спасибо. Можете ли вы указать, что вы подразумеваете под примером копирования? –

+2

Вы говорите, как выглядят ваши данные, но вы не предоставляете код для их создания. Это означает, что любой, кто пытается помочь вам, сначала должен будет написать код для создания этих фреймов данных. Гораздо проще скопировать и вставить код, чтобы добраться до той же точки, что и сейчас, а не тратить время на повторное создание ваших структур данных. Попробуйте сделать df.to_dict() на ваших объектах, а затем отправьте код типа 'DF1 = pandas.DataFrame ({'User': ...})' etc вместо простого описания того, что у вас есть в словах. – chthonicdaemon

ответ

-1

Во-первых, объединить DF1 и df2

df = DF2.merge(DF1,on="User") 

и создать индикатор ("держать"), если время находится между началом и времени времени заканчивается

import numpy as np 
df.loc[:,"keep"] = (np.logical_and(df.loc[:,"Time start"]<=df.loc[:,"Time"],df.loc[:,"Time"]<=df.loc[:,"Time end"]))*1 

Выход:

Time    User Value Time end   Time start  keep 
2014-01-03 04:11:00 User01 9 2014-01-01 08:13:43 2014-01-01 08:12:00 0 
2014-01-01 08:10:00 User01 12 2014-01-01 08:13:43 2014-01-01 08:12:00 0 
2014-01-03 09:11:00 User02 3 2014-01-04 01:07:01 2014-01-03 07:21:44 1 
2014-01-02 11:10:00 User02 21 2014-01-04 01:07:01 2014-01-03 07:21:44 0 

Теперь только сохранить строки, где держат = 1

df = df.loc[df.keep==1,:] 

Теперь сделайте aggrgation на ДФ с помощью GroupBy

df4 = df.groupby("User")["Value"].agg(['max','mean','std']).reset_index() 

выход:

User max mean std 
    User02 3 3 NaN 

слияния df4 с DF1

DF1.merge(df4.reset_index(), on="User",how="left") 

выход:

Time end   Time start   User max mean std 
2014-01-01 08:13:43 2014-01-01 08:12:00 User01 NaN NaN NaN 
2014-01-04 01:07:01 2014-01-03 07:21:44 User02 3.0 3.0 NaN 
+0

Лицо, которое отклонило мой ответ, пожалуйста, дайте мне знать, почему? так что я могу помочь вам с этим. –

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