创建一个 Pandas 数据透视表来计算项目一起出现在列表中的次数

you*_*att 8 python numpy pivot-table pandas

我正在尝试计算用户在同一会话中查看页面的次数。

我从一个列出 user_ids 和他们访问过的页面 slug 的数据框开始:

user_id page_view_page_slug
1       slug1
1       slug2
1       slug3
1       slug4
2       slug5
2       slug3
2       slug2
2       slug1
Run Code Online (Sandbox Code Playgroud)

我想要得到的是一个数据透视表,它计算 slug 横截面的 user_ids

. 弹头1 弹头2 弹头3 弹头4 弹头5
弹头1 2 2 2 1 1
弹头2 2 2 2 1 1
弹头3 2 2 2 1 1
弹头4 1 1 1 1 0
弹头5 1 1 1 0 1

我意识到这将是我们看到 slug1 和 slug2 与 slug2 和 slug1 时反映的相同数据,但我想不出更好的方法。到目前为止我已经做了一个listagg

def listagg(df, grouping_idx):
    return df.groupby(grouping_idx).agg(list)
new_df = listagg(df,'user_id')
Run Code Online (Sandbox Code Playgroud)

返回:

          page_view_page_slug
user_id                                                   
1        [slug1, slug2, slug3, slug4]
2        [slug5, slug3, slug2, slug2]
7        [slug6, slug4, slug7]
9        [slug3, slug5, slug1]
Run Code Online (Sandbox Code Playgroud)

但是我正在努力考虑循环来计算项目何时一起出现在列表中(尽管有顺序)以及如何存储它。然后我也不知道如何以可旋转的格式获得它。

Shu*_*rma 3

这是另一种方法,使用 numpy 广播创建一个矩阵,该矩阵是通过将每个值与user_id其他值进行比较而获得的,然后从该矩阵创建一个新的数据帧,并将其index设置columns为并page_view_page_slug进行sum计算,并计算该矩阵的横截面蛞蝓:level=0axis=0axis=1user_ids

a = df['user_id'].values
i = list(df['page_view_page_slug'])

pd.DataFrame(a[:, None] == a, index=i, columns=i)\
   .sum(level=0).sum(level=0, axis=1).astype(int)
Run Code Online (Sandbox Code Playgroud)
       slug1  slug2  slug3  slug4  slug5
slug1      2      2      2      1      1
slug2      2      2      2      1      1
slug3      2      2      2      1      1
slug4      1      1      1      1      0
slug5      1      1      1      0      1
Run Code Online (Sandbox Code Playgroud)