Python数据帧:Groupby和Transform



我有一个Python熊猫数据帧(df1(,它有3列:UserId、TimeStamp和Context。此数据帧表示应用程序中用户操作的日志。每个用户有多行。

我必须将这个数据帧与UserId上的另一个数据帧(df2(合并。该数据帧(df2(包含关于用户的信息(即他们的出生日期、帐户创建日期等(。目标是执行机器学习。我将不得不使用df1和df2中动作之间的时间来创建特性。但在做这件事之前,我想把所有东西都放在一个数据帧中,让它更容易(希望?(

我最初的想法是在UserId上对df1进行分组,并将TimeStamp和Context转换为一个具有对象的数组:{TimeStamp,Context},然后将这个新的df合并到df2中。

这是个好主意吗?如果没有,你会怎么做?

我最初只是想寻求帮助,将df1中的数据分组并聚合到一个新的数据帧中。以下是我到目前为止所得到的结果和期望的结果。

谢谢

Raw data
df1 = df[['UserId', 'Timestamp', 'Context']]
----------------------------------------------------
UserId    TimeStamp             Context
1   618884    2015-12-18 11:29:33   410-513-FD-10-01
2   618884    2015-12-18 11:29:38   540-823-RE-12-01
3   620141    2015-12-18 12:29:02   101-901-RE-10-03
4   620141    2015-12-18 12:29:34   Other
----------------------------------------------------
Current code    
gp = df1.groupby(['UserId']).agg({'UserId': 'first',
'TimeStamp': ', '.join,})
gp.head()
----------------------------------------------------
Current output      
UserId  UserId  Timestamp
585953  585953  2016-04-01 11:08:06, 2016-04-01 11:08:10
586182  586182  2016-05-01 15:53:01
586400  586400  2015-12-27 12:31:11, 2015-12-27 12:31:44, 2015-12-29 14:35:38, 2015-12-29 14:35:45, 2016-01-10 01:42:28
586573  586573  2016-01-12 14:40:41, 2016-04-19 19:56:41, 2016-04-19 19:56:55
586716  586716  2016-01-13 13:50:05
----------------------------------------------------
Desired result:
UserId                       Actions
1                            [ { 2016-04-01 19:40:32, 410-513-FD-10-01 }
{ 2017-05-03 20:34:21, 320-391-RE-12-03 } ]
2                            [ { 2019-03-12 12:08:12, Other } ]

不能使用groupbyaggtransform,因为转换应用于每列。在处理TimeStamp列时,无法访问Context列。一种经典的方法是使用groupby_apply:

out = df.groupby('UserId').apply(lambda x: list(zip(x['TimeStamp'], x['Context']))) 
.rename('Actions').reset_index()
print(out)
# Output
UserId                                            Actions
0  618884  [(2015-12-18 11:29:33, 410-513-FD-10-01), (201...
1  620141  [(2015-12-18 12:29:02, 101-901-RE-10-03), (201...

注意:如果我是你,我不做这个操作,我会直接合并这两个数据帧。您的列Actions现在太复杂,无法处理ML。

最新更新