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 } ]

您不能使用 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...

注意:如果我是你,我不做这个操作,我会直接合并2个dataframes。您的专栏 Actions 现在太复杂了,无法进行 ML 处理。