如何在Pandas中将DataFrame转换为方阵?以及如何将表1透视转换为表2的方阵(统计各事件中anonymous_id的去重计数)
如何用Pandas将DataFrame转换为事件交集用户数的方阵
嘿,我明白你的需求啦!你手上有一张包含用户ID和事件名称的表,想要生成一个方阵——行和列都是事件类型,每个单元格的值是同时参与了行事件和列事件的唯一用户数量。下面我用具体的代码示例一步步帮你实现。
步骤1:先模拟你的原始数据(对应你说的图1)
假设你的原始DataFrame长这样(我用模拟数据代替你提到的图):
import pandas as pd data = { "anonymous_id": [1, 1, 2, 3, 3, 4, 5, 5, 5], "event_name": [ "voucher denied", "item_checkout_started", "voucher denied", "item_checkout_started", "payment_completed", "payment_completed", "voucher denied", "item_checkout_started", "payment_completed" ] } df = pd.DataFrame(data)
步骤2:生成用户-事件的二进制标记矩阵
首先我们需要把每个用户和他们参与的事件转换成一个二进制矩阵——用户作为行,事件作为列,用户参与了某个事件就标记为1,没参与则为0:
# 生成用户-事件交叉表,用bool转int来标记是否参与 user_event_matrix = pd.crosstab(df["anonymous_id"], df["event_name"]).astype(bool).astype(int)
这一步得到的结果是:
| anonymous_id | item_checkout_started | payment_completed | voucher denied |
|---|---|---|---|
| 1 | 1 | 0 | 1 |
| 2 | 0 | 0 | 1 |
| 3 | 1 | 1 | 0 |
| 4 | 0 | 1 | 0 |
| 5 | 1 | 1 | 1 |
步骤3:计算事件交集的方阵
接下来,只需要把这个矩阵的转置和原矩阵做矩阵乘法,就能得到你想要的方阵啦!矩阵乘法的结果中,(事件A, 事件B)的值就是同时参与了事件A和事件B的用户数:
event_square_matrix = user_event_matrix.T.dot(user_event_matrix)
运行后得到的结果就是你要的表2样式:
| event_name | item_checkout_started | payment_completed | voucher denied |
|---|---|---|---|
| item_checkout_started | 3 | 2 | 2 |
| payment_completed | 2 | 3 | 1 |
| voucher denied | 2 | 1 | 3 |
额外小技巧:如果只想看单个事件的参与用户数
要是你只是想单独统计每个事件的参与用户数(也就是方阵的对角线值),直接分组计数就行:
single_event_user_count = df.groupby("event_name")["anonymous_id"].nunique()
结果会是:
event_name item_checkout_started 3 payment_completed 3 voucher denied 3 Name: anonymous_id, dtype: int64
为什么这个方法管用?
矩阵乘法的本质是计算两个向量的点积:当我们把用户-事件矩阵转置后,行变成了事件,列是用户;和原矩阵相乘时,每个事件对的点积就是同时出现在两个事件中的用户数量——完美匹配你需要的去重计数要求。
内容的提问来源于stack exchange,提问作者Mello
相关产品推荐
相关产品推荐

