首页 > 解决方案 > 计算给定列的排列出现次数

问题描述

在 Pyhon 中,我试图编写一些代码来计算数据集中给定排列的实例。让我更清楚。给定以下数据框

   WEB_ID          Category
   12332405        a
   3763583         b
   7930245         c
   7930245         a

我想要一个看起来像这样的数据框。

s    t    q
a    b    0
a    c    1
b    a    0
b    c    0
c    a    1
c    b    0

这是读取的,有 0 个 id 具有类别 a 和 b,1 具有 a 和 c,0 具有 b 和 a... 等等。

我正在使用 Itertools 模块创建所有类别的排列。我有一些想法,但看起来都很丑陋而且没有表现。

感谢您的帮助,如果不清楚,请告诉我,我会添加详细信息。

谢谢社区!

标签: pythonpandaspermutation

解决方案


有关于如何使笛卡尔积更高效的帖子,但基本思想是:

  • mergeon'WEB_ID'以获取'Category'. (这本质上给出了您想要获得的 AB-BA 匹配的互惠性)
  • groupby+size计算出现次数。
  • .reindex得到零。
  • 删除与自己合并的东西。

代码:

import pandas as pd

res = (df.merge(df, on='WEB_ID')
         .groupby(['Category_x', 'Category_y']).size()
         .reindex(pd.MultiIndex.from_product([df.Category.unique()]*2, 
                                              names=['s', 't']))).fillna(0)

res = res[res.index.get_level_values(0) != res.index.get_level_values(1)]
res = res.to_frame('q')

输出:res

       q
s t     
a b  0.0
  c  1.0
b a  0.0
  c  0.0
c a  1.0
  b  0.0

推荐阅读