在 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 中计算大数据的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章