我有一个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 } ]
不能使用groupby
和agg
或transform
,因为转换应用于每列。在处理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。