在Pandas组上按索引执行排序的更快方法

时间:2018-08-28 21:41:18

标签: python python-3.x pandas numpy pandas-groupby

我有一个名称为(person_name),颜色为(shirt_color)的数据框 每个人在特定的一天(颜色可以是任意的)穿具有特定颜色的衬衫

例如输入:

name    color
----------------
John    White
John    White
John    Blue
John    Blue
John    White
Tom     Blue
Tom     Blue
Tom     Green
Tom     Black
Jerry   Black
Jerry   Blue
Jerry   Black

我需要找到每个人穿的最好的彩色衬衫, 根据best_color_order例如结果:

name    color
-------------
Jerry   Blue
John    White
Tom     Green

我正在执行以下操作:

best_color_order = ['White', 'Green', 'Blue', 'Black']

best_color_list = [[name, list(group['color']).sort(key=best_color_order.index)[0]]
                    for name, group in df.groupby(by='name', sort=False, as_index=False)]

best_color_df = pd.DataFrame(best_color_list, columns=['name', 'color'])

如果我有数百万条记录,是否有更快的方法?

1 个答案:

答案 0 :(得分:3)

将列color转换为ordered categorical,以便将其按您想要的顺序排序,然后按color排序值,最后按groupby排序并取{{ 1}}每个名称的值:

first

[EDIT] :一种更快的方法可能是执行相同操作,但是要代替groupby,只需删除重复的best_color_order = ['White', 'Green', 'Blue', 'Black'] df['color'] = pd.Categorical(df['color'], categories = best_color_order, ordered=True) df.sort_values('color').groupby('name').first() color name Jerry Blue John White Tom Green 并保留第一个(这是默认设置)。函数name):

drop_duplicates