python - 在过滤和聚合时合并两个熊猫数据框
问题描述
我有两个熊猫数据框。一种是以下格式:
|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 和第一行限制内的购买时间,然后对该子数据帧进行分组和旋转,然后将所有这些子数据帧组合在一起成为最后一个。它可以工作,但速度很慢,尤其是对于具有数十万行的数据帧。
有一个更好的方法吗?感谢您的帮助!
解决方案
尝试使用两个pd.DataFrame.groupby
spd.DataFrame.join
和pd.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
推荐阅读
- javascript - 使用快速路由器传递数据
- flutter - Flutter TextField BorderSides合并到非常粗的线
- r - 将列值传递给 ggplot 函数的标题
- javascript - 检查请求是否已经发送
- python - 如何在字典中打印多个项目
- bash - Bash如何在没有人工干预的情况下删除centos包,在amazon linux 2中卸载SSM代理
- jmeter - Jmeter CSS选择器提取器
- html - 如何使用 flexbox 旋转第一个元素并使其全高?
- angular - 角库找不到模块'name-lib'
- extract - raster::extract 无法生成预期的 data.frame