为了账号安全,请及时绑定邮箱和手机立即绑定

更快地执行pandas groupby操作的替代方法

更快地执行pandas groupby操作的替代方法

婷婷同学_ 2021-05-30 14:54:06
我有一个以名称 (person_name)、日期和颜色 (shirt_color) 作为列的数据集。每个人在特定的一天都穿着某种颜色的衬衫。天数可以是任意的。例如输入:name  day  color----------------John   1   WhiteJohn   2   WhiteJohn   3   BlueJohn   4   BlueJohn   5   WhiteTom    2   WhiteTom    3   BlueTom    4   BlueTom    5   BlackJerry  1   BlackJerry  2   BlackJerry  4   BlackJerry  5   White我需要找到每个人最常用的颜色。例如结果:name    color-------------Jerry   BlackJohn    WhiteTom     Blue我正在执行以下操作来获取结果,效果很好,但是速度很慢:most_frquent_list = [[name, group.color.mode()[0]]                         for name, group in data.groupby('name')]most_frquent_df = pd.DataFrame(most_frquent_list, columns=['name', 'color'])现在假设我有一个包含 500 万个唯一名称的数据集。进行上述操作的最佳/最快方法是什么?
查看完整描述

3 回答

?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

更新


必须很难克服这一点(在示例daraframe上比任何建议的pandas解决方案快10倍,比建议的numpy解决方案快1.5倍)。要点是要远离大熊猫并使用itertools.groupby它,因为它涉及非数值数据时,做得更好。


from itertools import groupby

from collections import Counter


pd.Series({x: Counter(z[-1] for z in y).most_common(1)[0][0] for x,y 

          in groupby(sorted(df.values.tolist()), 

                            key=lambda x: x[0])})

# Jerry    Black

# John     White

# Tom       Blue

旧答案


这是另一种方法。它实际上比原始版本慢,但我将其保留在此处:


data.groupby('name')['color']\

    .apply(pd.Series.value_counts)\

    .unstack().idxmax(axis=1)

# name

# Jerry    Black

# John     White

# Tom       Blue


查看完整回答
反对 回复 2021-06-01
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

解决方案来自 pd.Series.mode


df.groupby('name').color.apply(pd.Series.mode).reset_index(level=1,drop=True)

Out[281]: 

name

Jerry    Black

John     White

Tom       Blue

Name: color, dtype: object


查看完整回答
反对 回复 2021-06-01
  • 3 回答
  • 0 关注
  • 397 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信