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

我有一个以名称 (person_name)、日期和颜色 (shirt_color) 作为列的数据集。


每个人在特定的一天都穿着某种颜色的衬衫。天数可以是任意的。


例如输入:


name  day  color

----------------

John   1   White

John   2   White

John   3   Blue

John   4   Blue

John   5   White

Tom    2   White

Tom    3   Blue

Tom    4   Blue

Tom    5   Black

Jerry  1   Black

Jerry  2   Black

Jerry  4   Black

Jerry  5   White

我需要找到每个人最常用的颜色。


例如结果:


name    color

-------------

Jerry   Black

John    White

Tom     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 万个唯一名称的数据集。进行上述操作的最佳/最快方法是什么?


婷婷同学_
浏览 421回答 3
3回答

一只斗牛犬

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

米琪卡哇伊

解决方案来自 pd.Series.modedf.groupby('name').color.apply(pd.Series.mode).reset_index(level=1,drop=True)Out[281]: nameJerry    BlackJohn     WhiteTom       BlueName: color, dtype: object
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python