【问题标题】:Optimal way to count big data in pandas在 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 万条记录...有更好的方法吗?

【问题讨论】:

    标签: python optimization map pandas bigdata


    【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 2015-03-27
      • 2017-03-26
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      • 2016-10-11
      • 2023-03-24
      • 1970-01-01
      • 2011-10-19
      相关资源
      最近更新 更多