首页 > 解决方案 > 在过滤和聚合时合并两个熊猫数据框

问题描述

我有两个熊猫数据框。一种是以下格式:

|Customer ID | Login_Session_Start_Time | Login_Session_End_Time | 
|------------|--------------------------|------------------------|
|   1        | 2018-04-05 10:03:23      |  2018-04-05 10:15:12   |
|   1        | 2018-04-19 22:12:42      |  2018-04-19 22:45:11   | 
|   2        | 2018-04-01 08:23:14      |  2018-04-01 14:34:01   |
........

其中列出了每个客户在某个网站上花费的时间。我还有另一个数据框,来自不同的来源,列出了他们购买的商品和时间。它看起来像这样:

| Customer ID |  Purchase Description    | Purchase Time        |
|-------------|--------------------------|----------------------|
|     1       | Shirt                    | 2018-04-05 10:11:04  |
|     2       | Pants                    | 2018-04-01 09:35:13  |
|     2       | Shirt                    | 2018-04-01 13:12:09  |

…………

我需要以这样的方式合并这两个数据框,它可以告诉我客户在每个登录会话中购买了多少种商品。所以对于上面的例子,它看起来像:

|Customer ID | Login_Session_Start_Time | Login_Session_End_Time | Num_Shirts | Num_Pants |
|------------|--------------------------|------------------------|------------|-----------|
|   1        | 2018-04-05 10:03:23      |  2018-04-05 10:15:12   |   1        |        0  |
|   2        | 2018-04-01 08:23:14      |  2018-04-01 14:34:01   |   1        |        1  |
 .....

因此,它将涉及在过滤时合并(购买时间在 Login_Session_Start_Time 和 Login_Session_End_Time 内)、分组(按购买描述)和可能的旋转。

我能想到的唯一方法是遍历第一个数据帧的每一行,然后在循环中选择第二个数据帧的子数据帧,其中包含匹配的客户 ID 和第一行限制内的购买时间,然后对该子数据帧进行分组和旋转,然后将所有这些子数据帧组合在一起成为最后一个。它可以工作,但速度很慢,尤其是对于具有数十万行的数据帧。

有一个更好的方法吗?感谢您的帮助!

标签: pythonpandaspandas-groupby

解决方案


尝试使用两个pd.DataFrame.groupbyspd.DataFrame.joinpd.get_dummies

print(df.groupby('Customer ID', as_index=False).first().join(pd.get_dummies(df2, columns=['Purchase Description']).groupby(['Customer ID'], as_index=False).sum().iloc[:, 1:]))

输出:

   Customer ID Login_Session_Start_Time Login_Session_End_Time  \
0            1        20180405 10:03:23      20180405 10:15:12   
1            2        20180401 08:23:14      20180401 14:34:01   

   Purchase Description_Pants  Purchase Description_Shirt  
0                           0                           1  
1                           1                           1

推荐阅读