如何使用python有效地填充给定一个非常大的表的矩阵?

Posted

技术标签:

【中文标题】如何使用python有效地填充给定一个非常大的表的矩阵?【英文标题】:How to efficiently populate a matrix given a very large table using python? 【发布时间】:2016-11-16 23:00:16 【问题描述】:

我有一个三列'customer'、'item_id'、'ct_id' 的表,但行数约为 300 万。唯一的 'item_id' 有 20350 个条目,而 'customer' 有 2485 个条目。在 20350 种商品中,每位顾客可以购买任意数量的商品

目标是建立一个基于表格的推荐系统。首先,我要构造一个 2485x20350 的矩阵,其行是“客户”,列是“项目 ID”。 每个元素是表中 'customer' & 'item_id' 对的出现次数。那么我可以根据这个客户/商品矩阵构建相似度矩阵。

我尝试在 pandas 中使用 pivot_table,如下所示: d_pivt = dt.pivot_table(index=['cstm_num','it_num'], aggfunc='count'),

我只是想知道,有了这些信息,构建我想要的矩阵的最有效方法是什么。

谢谢,

【问题讨论】:

所以您尝试使用pivot_table,您的尝试出了什么问题?它是否引发了错误,是不是太慢了?请详细说明为什么它不适合您。 【参考方案1】:

你在列中说'item_id',在行中说'customer'

d_pivt = dt.pivot_table(values='ct_id', index='customer',
                        columns='item_id', aggfunc='count')

演示

df = pd.DataFrame(np.random.randint(0, 10, (1000, 3)),
                  columns=['customer', 'item_id', 'ct_id'])

df.pivot_table('ct_id', 'customer', 'item_id', 'count')

【讨论】:

我想创建一个以customer为行,item_id为列的矩阵。 @Y.Liu 我已经更新了我的帖子。如果这不是您想要的,那么您需要向我们展示您想要的,因为告诉我们是行不通的。 非常感谢。我测试了我的数据。这正是我想要的。现在我删除 NaN 后,我的客户/项目矩阵如下所示:【参考方案2】:

@piRSquared 你的方法就像我想要的那样工作。现在我的客户/项目矩阵如下所示: enter image description here

我还没有被允许添加图片。 :-(

但我得到了我想要的矩阵,其尺寸为 2485x20350。 您可以通过上面的图片链接看到,有很多零,因为客户可能只购买了数百件商品。 我尝试使用以下方法计算项目相关矩阵:

sall_pvtb = sales_all.pivot_table(values='cm_id', index='cstm_num',  
columns = 'it_num', aggfunc='count')

sall_pvtb.fillna(0, inplace = True)

sall_corr = sall_pvtb.corr()

但是项目相关性计算需要很长时间,因为它是一个 20350x20350 大小的矩阵。相关计算稀疏完成?

【讨论】:

以上是关于如何使用python有效地填充给定一个非常大的表的矩阵?的主要内容,如果未能解决你的问题,请参考以下文章

有效地为一个非常大的表中的每个组选择最新行?

在 PLSQL 中,如何迭代更新一个非常大的表的字段?

当 Python 中的输入是大数时,如何有效地在一个范围内找到完美的正方形

一个非常大的表的 SQL 分区

如何通过索引从一个非常大的列表中有效地删除元素?

如何使用python有效地填充“缺失时间模式”和“填充它们”具有特定值?