You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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_iditem_checkout_startedpayment_completedvoucher denied
1101
2001
3110
4010
5111

步骤3:计算事件交集的方阵

接下来,只需要把这个矩阵的转置和原矩阵做矩阵乘法,就能得到你想要的方阵啦!矩阵乘法的结果中,(事件A, 事件B)的值就是同时参与了事件A和事件B的用户数:

event_square_matrix = user_event_matrix.T.dot(user_event_matrix)

运行后得到的结果就是你要的表2样式:

event_nameitem_checkout_startedpayment_completedvoucher denied
item_checkout_started322
payment_completed231
voucher denied213

额外小技巧:如果只想看单个事件的参与用户数

要是你只是想单独统计每个事件的参与用户数(也就是方阵的对角线值),直接分组计数就行:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 16:53:11