python - 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()
但这种方法只显示,整体价值计数,而不是重复对
解决方案
用于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()
会给你出现最多的一对。
推荐阅读
- javascript - 寻找有关角度功能模块之间路由的指针
- flutter - 构建失败并出现异常。颤振框架
- python - 将两个数据帧相互连接的问题
- java - 在 TEIID 中合并两个 Java 对象
- python - 如何在 Python 中使用 Kullback-Leibler 方法最小化 Weibull 分布的参数?
- html - 为什么我的光标不会更改为自定义图像?
- python - 仅在特定时间启用 Google Cloud Scheduler (GCP)
- c# - MethodImplOptions.AggressiveInlining 是否可以防止昂贵的参数在不使用时进行评估?
- c++ - C++/CLI VS 错误“ClassLibrary.dll 不是有效的 win32 应用程序”。更改启动项
- swiftui - 如何从计算属性创建自定义绑定?