首页 > 解决方案 > Python获取在数据框中出现最多的类别对

问题描述

鉴于下表是数据集,有 4 列和数据集的前 14 行,但有超过 10,000 行。在一个订单中,有多个产品被出售给一个客户。

我想知道,在所有订单中,哪对产品类别出现最多?示例(Cat1 和 Cat2)

使用任何 python 库,如 numpy、pandas 等。仅使用 python 解决

注意 - 只有 3 个类别,产品 ID 是唯一列,订单 ID 和客户 ID 不重复。

OrderID ProdID Prodcategory Client ID
4997    1   Cat 1   21
4997    2   Cat 1   22
4997    3   Cat 2   23
4997    4   Cat 3   24
2001    5   Cat 1   25
2001    6   Cat 2   26
2001    7   Cat 2   27
2001    8   Cat 2   28
2001    9   Cat 3   29
2376    10  Cat 3   30
2376    11  Cat 1   31
2376    12  Cat 2   32
2376    13  Cat 3   33
2376    14  Cat 1   34

我想要在所有订单中出现最多的对。例如订单 4997 (Cat 1, Cat 2) (Cat 2, Cat 3) 和 (Cat 1, Cat 3 ) 都出现一次。在 2001 年的订单中, (Cat 1, Cat 2) (Cat1, Cat 3) (Cat 2, Cat 3) 总共出现一次

我的方法

# Import required libraries
import pandas as pd
import matplotlib.pyplot as plt



# Read the data into the dataframe
#df = pd.read_clipboard()
df



df.columns



df["Product category "].value_counts()



mylabels = ['Cat 2', 'Cat 1', 'Cat 3']
plt.pie(df["Product category "].value_counts(), labels = mylabels)
plt.show() 

但这种方法只显示,整体价值计数,而不是重复对

标签: pythonpandasdataframedata-sciencedata-analysis

解决方案


用于crosstab/groupby().size()获取订单中每个类别的出现次数。然后矩阵乘法计算共现:

ct = pd.crosstab(df['OrderID'], df['Prodcategory']).gt(0).astype(int)
co_occur = (ct.T @ ct)

输出:

Prodcategory  Cat 1  Cat 2  Cat 3
Prodcategory                     
Cat 1             3      3      3
Cat 2             3      3      3
Cat 3             3      3      3

然后您可以屏蔽重复项,堆叠并使用输出:

counts = co_occur.where(np.tri(len(co_occur), k=-1, dtype=bool)).stack()

这是:

Prodcategory  Prodcategory
Cat 2         Cat 1           3.0
Cat 3         Cat 1           3.0
              Cat 2           3.0
dtype: float64

并且counts.idxmax()会给你出现最多的一对。


推荐阅读