如何在 Pandas DataFrame 中计算项集频率

如何在 Pandas DataFrame 中计算项集频率

在数据挖掘中,频繁项集是指在数据集中同时出现频率比较高的一组元素,而其所包含的元素称为频繁项。在 Pandas DataFrame 中,我们可以使用特定的函数来计算项集频率。

什么是频繁项集?

频繁项集是指在数据集中同时出现频率比较高的一组元素。这个组合中的每一项被称为频繁项,而出现次数超过定义阈值的可能性越高。这个定义阈值通常使用事务数量的百分比进行定义。

Pandas 中的交易数据

在 Pandas 中,我们经常需要处理交易数据,这些数据包含了多个项的组合。比如在一张购物清单中,每个记录都包含了多个商品的名称和数量信息。这些交易数据可以被表示成一个 DataFrame,每个记录表示一笔交易中出现的多个商品。在 Pandas 中,这个 DataFrame 可以如下定义:

import pandas as pd

data = {'Transaction': ['T1', 'T2', 'T3', 'T4','T5'],  
        'Items': [['Bread', 'Milk'], 
                  ['Bread', 'Diaper', 'Beer', 'Eggs'], 
                  ['Milk', 'Diaper', 'Beer', 'Cola'], 
                  ['Bread', 'Milk', 'Diaper', 'Beer'], 
                  ['Bread', 'Milk', 'Diaper', 'Cola']]}  

df = pd.DataFrame(data, columns=['Transaction', 'Items'])
print(df)

这个 DataFrame 包含了五笔交易数据,每一笔交易中可能出现的多个商品被储存在 Items 列中。现在我们需要从这个 DataFrame 中计算每个商品出现的频率。

使用 Pandas 计算频繁项集

在 Pandas 中,我们可以很容易地使用 explode 函数将嵌套的列表扁平化,然后用 value_counts 函数统计每个商品出现的次数。代码如下:

items = df.explode('Items')['Items']
freq = items.value_counts(normalize=True)
print(freq)

这里的 normalize 参数被设置为 True,代表统计每个商品出现的频率。输出结果如下:

Milk       0.8
Bread      0.8
Diaper     0.6
Beer       0.6
Cola       0.4
Eggs       0.2
Name: Items, dtype: float64

Pandas DataFame 中的项集

在 Pandas 中,一个项集是指出现于数据集中的所有项的集合。比如在一个购物清单中,[“Bread”, “Milk”] 就是一个项集,其中 Bread 和 Milk 是两项。在一个 DataFrame 中,每个项集可以被表示成一个列表。比如下面这个例子中,我们需要计算购物清单中所有两个商品的项集的频率:

from itertools import combinations

items = df['Items'].apply(lambda x: list(combinations(x, 2)))
items = pd.Series([i for item in items for i in item])
freq = items.value_counts(normalize=True)
print(freq)

运行结果如下:

(Milk, Bread)        0.8
(Diaper, Beer)       0.6
(Milk, Diaper)       0.6
(Diaper, Cola)       0.4
(Bread, Diaper)      0.4
(Bread, Milk)        0.4
(Milk, Cola)         0.2
(Bread, Diaper)      0.2
(Bread, Beer)        0.2
(Eggs, Bread)        0.2
(Diaper, Bread)      0.2
(Eggs, Diaper)       0.2
(Milk, Diaper, Cola)  0.2
(Beer, Eggs)         0.2
(Diaper, Milk)       0.2
dtype: float64

在这个例子中,我们使用了 itertools.combinations 函数来计算出所有的两个商品的组合。然后我们使用了 value_counts 函数计算了每个组合出现的次数,并将其归一化。

使用 Pandas 和 MLxtend 计算频繁项集

如果你需要在 Pandas 中计算频繁项集,可以使用 MLxtend 中的 Apriori 算法。首先,你需要安装 MLxtend,可以使用以下命令:

!pip install mlxtend

然后可以使用以下代码来计算出现频率最高的项集:

from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori

te = TransactionEncoder()
te_ary = te.fit_transform(df['Items'])
df = pd.DataFrame(te_ary, columns=te.columns_)
freq = apriori(df, min_support=0.6, use_colnames=True)
print(freq)

在这个例子中,我们使用了 MLxtend 中的 TransactionEncoder 函数来将 DataFrame 转换为交易数据。然后我们使用了 Apriori 算法来计算出现频率最高的项集。在这个例子中,我们设定了最小支持度为 0.6,代表有 60% 以上的交易中包含该项集。输出结果如下:

   support      itemsets
0      0.8       (Bread)
1      0.8        (Milk)
2      0.6      (Diaper)
3      0.6        (Beer)
4      0.4        (Cola)
5      0.6  (Milk, Bread)
6      0.6   (Diaper, Beer)
7      0.6  (Milk, Diaper)

可以看到,这个函数除了计算支持度以外,还返回了每个项集的组合。同时,你可以通过修改 min_support 参数来设定不同的最小支持度。

结论

在这篇文章中,我们介绍了在 Pandas DataFrame 中计算项集频率的方法。我们使用了 Pandas 内置的函数和 MLxtend 中的 Apriori 算法来实现这个目标。这些方法可以帮助你更好地理解数据集,并且为你的数据挖掘流程提供支持。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程