在 pandas 中计算大数据的最佳方法

Posted

技术标签:

【中文标题】在 pandas 中计算大数据的最佳方法【英文标题】:Optimal way to count big data in pandas 【发布时间】:2014-05-21 04:05:44 【问题描述】:

我在 pandas 中有一个包含 19,000,000 行的数据框。标题是艺术家和周。我想添加另一列,用于计算艺术家在给定一周内出现的次数。现在我正在使用以下代码:

#Function to determine the number
def playsxweek(week,art):
    return len(data[(data.week == week) & (data.artist == art)])
#Then I map
data['playsxweek'] = map(playsxweek,data['week'],data['artist'])

现在代码需要很长时间才能处理所有 1900 万条记录...有更好的方法吗?

【问题讨论】:

【参考方案1】:

之所以永远如此,不是因为它的处理次数是 19,000,000 次,而是 3 万亿次

如果有 3 位艺术家和 52 周,那就是 3 x 52 x 19,000,000 或 2,964,000,000。 3 万亿次搜索,每增加一位新艺术家,就会再增加 988,000,000 次。每位艺术家的搜索量接近一万亿次!

相反,遍历数据一次并在遍历时建立一个计数(此示例假设每一行都可以作为字典访问):

playsPerWeek=dict()
for row in data:
    week, artist = row['week'],row['artist']
    playsPerWeek[(week, artist)] = playsPerWeek.get((week, artist),0) + 1

这里我们实例化一个计数,并遍历每一行一次。然后我们使用.get()来查看(week, artist)元组是否作为key存在(如果不使用默认值0),加一并赋值给字典。

作为参考,由于元组是不可变的,它们可以用作字典键,而列表不能。

【讨论】:

唯一的问题是,由于数据的性质,它会抛出“太多值无法解包”的错误......也许可以试试 iteritems()? 好吧,我不是 100% 不喜欢 pandas,所以你需要更具体地修复迭代。我做了一个小改动,可能更接近你的需要。但是为什么您的代码花费了这么长时间背后的逻辑仍然存在。 你应该看看 HYRY soln,效率会更高。【参考方案2】:

我认为groupby会解决问题:

data.groupby(["week", "artist"]).count()

【讨论】:

以上是关于在 pandas 中计算大数据的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

Pandas大数据筛选数据经验教训一则

有啥有效的方法来计算大数据表列中的二进制值?

数据分析---大数据及机器学习

大数据最佳学习路线

大数据最佳学习路线

大数据最佳学习路线总结