[英]Pandas: Grouping by date, aggregating on other column
我有這個數據框。 有關許可證使用情況的信息:
usuario feature fini ffin delta
0 USER-1 PROGRAM-1 2016-06-30 21:03:21 2016-06-30 21:03:34 00:00:13
2 USER-1 PROGRAM-1 2016-06-30 21:09:20 2016-06-30 21:09:32 00:00:12
4 USER-1 PROGRAM-1 2016-06-30 21:14:40 2016-06-30 21:15:34 00:00:54
6 USER-1 PROGRAM-1 2016-06-30 21:16:42 2016-06-30 21:17:24 00:00:42
8 USER-1 PROGRAM-1 2016-06-30 21:18:09 2016-06-30 21:18:21 00:00:12
對不起,西班牙語中的字段,但您明白了。 fini
表示fecha inicial(初始日期)和ffin
fecha final(結束日期),因為您猜測delta是ffin-fini
因此,我想知道在這種情況下USER-1在他正在使用的任何程序(PROGRAM-1)中花費了多少時間。
如果我做一個table['delta'].sum()
我得到了我想要的,它說他用了00:02:13。
現在,假設我有更多的用戶,更多的功能,並且想將它們按天(也許是幾個小時)分組,以了解人們如何使用他們的許可證
我嘗試了重采樣,但是我真的不明白它是如何工作的。 我看到有一個Grouper函數,但是我沒有安裝它。
下面的行將幫助您按用戶以及日期和小時進行分組(僅供參考。如果要改為使用df['fini'].dt.hour
,它將在多天內匯總同一小時的值):
df.groupby([df['usuario'], df['fini'].apply(lambda x: x.round('h'))]).delta.sum()
將其應用於示例的擴展版本:
d = {
'usuario':['USER-1','USER-1','USER-1','USER-1','USER-1','USER-1','USER-1','USER-1','USER-1','USER-1','USER-2','USER-2'],
'feature':['PROGRAM-1','PROGRAM-1','PROGRAM-1','PROGRAM-1','PROGRAM-1','PROGRAM-1','PROGRAM-1','PROGRAM-1','PROGRAM-2','PROGRAM-2','PROGRAM-1','PROGRAM-1'],
'fini':['2016-06-30 21:03:21','2016-06-30 21:09:20','2016-06-30 21:14:40','2016-06-30 21:16:42','2016-06-30 21:18:09', '2016-06-30 22:03:21','2016-06-30 22:09:20','2016-07-01 21:03:21','2016-07-01 22:09:20','2016-07-01 23:14:40','2016-06-30 17:16:42','2016-06-30 18:18:09'],
'ffin':['2016-06-30 21:03:34','2016-06-30 21:09:32','2016-06-30 21:15:34','2016-06-30 21:17:24','2016-06-30 21:18:21', '2016-06-30 22:04:02','2016-06-30 22:09:51','2016-07-01 21:03:43','2016-07-01 22:10:12','2016-07-01 23:15:03','2016-06-30 17:17:23','2016-06-30 18:18:19']
}
df = pd.DataFrame(data=d)
date_cols = ['fini', 'ffin']
for col in date_cols:
df[col] = pd.to_datetime(df[col])
df['delta'] = df['ffin'] - df['fini']
df.groupby([df['usuario'], df['fini'].apply(lambda x: x.round('h'))]).delta.sum()
輸出以下內容:
usuario fini
USER-1 2016-06-30 21:00:00 00:02:13
2016-06-30 22:00:00 00:01:12
2016-07-01 21:00:00 00:00:22
2016-07-01 22:00:00 00:00:52
2016-07-01 23:00:00 00:00:23
USER-2 2016-06-30 17:00:00 00:00:41
2016-06-30 18:00:00 00:00:10
Name: delta, dtype: timedelta64[ns]
另外,如果您願意,向groupby添加功能很簡單:
df.groupby([df['usuario'], df['feature'], df['fini'].apply(lambda x: x.round('h'))]).delta.sum()
輸出:
usuario feature fini
USER-1 PROGRAM-1 2016-06-30 21:00:00 00:02:13
2016-06-30 22:00:00 00:01:12
2016-07-01 21:00:00 00:00:22
PROGRAM-2 2016-07-01 22:00:00 00:00:52
2016-07-01 23:00:00 00:00:23
USER-2 PROGRAM-1 2016-06-30 17:00:00 00:00:41
2016-06-30 18:00:00 00:00:10
Name: delta, dtype: timedelta64[ns]
這是代碼的分組通過數據usuario
和日期(如在提供fini
)。 如果要使用其他分組方案(例如,基於日期和小時),則可以相應地進行修改:
import pandas as pd
df = pd.DataFrame({'usuario': ['USER-1']*5,
'feature': ['PROGRAM-1']*5,
'fini': ['2016-06-30 21:03:21',
'2016-06-30 21:09:20',
'2016-06-30 21:14:40',
'2016-07-30 21:16:42',
'2016-07-30 21:18:09'],
'ffin': ['2016-06-30 21:03:34',
'2016-06-30 21:09:32',
'2016-06-30 21:15:34',
'2016-07-30 21:17:24',
'2016-07-30 21:18:21'],
'delta': ['00:00:13',
'00:00:12',
'00:00:54',
'00:00:42',
'00:00:12']})
# proper formatting for columns
df.fini = pd.to_datetime(df.fini)
df.ffin = pd.to_datetime(df.ffin)
df.delta = pd.to_timedelta(df.delta)
print(df.groupby([df.usuario, df.fini.dt.date]).delta.sum())
#usuario fini
#USER-1 2016-06-30 00:01:19
# 2016-07-30 00:00:54
#Name: delta, dtype: timedelta64[ns]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.