Python 数据框:Groupby 和转换
Python Dataframe : Groupby and Transform
我有一个包含 3 列的 Python pandas 数据框 (df1):UserId、TimeStamp、Context。此数据框表示应用程序内用户操作的日志。每个用户有多行。
我必须将此数据框与 UserId 上的另一个数据框 (df2) 合并。该数据框 (df2) 包含有关用户的信息(即他们的生日、帐户创建日期等)。目标是执行机器学习。我将不得不使用 df1 和 df2 中的操作之间的时间来创建功能。但在此之前,我希望将所有内容都放入 1 个数据框中以使其更容易(希望如此?)
我最初的想法是在 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...
注意:如果我是你,我不做这个操作,我会直接合并2个dataframes。您的专栏 Actions
现在太复杂了,无法进行 ML 处理。
我有一个包含 3 列的 Python pandas 数据框 (df1):UserId、TimeStamp、Context。此数据框表示应用程序内用户操作的日志。每个用户有多行。
我必须将此数据框与 UserId 上的另一个数据框 (df2) 合并。该数据框 (df2) 包含有关用户的信息(即他们的生日、帐户创建日期等)。目标是执行机器学习。我将不得不使用 df1 和 df2 中的操作之间的时间来创建功能。但在此之前,我希望将所有内容都放入 1 个数据框中以使其更容易(希望如此?)
我最初的想法是在 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...
注意:如果我是你,我不做这个操作,我会直接合并2个dataframes。您的专栏 Actions
现在太复杂了,无法进行 ML 处理。