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



我有一个数据框,其中名称(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'])

如果我有数百万条记录,有没有更快的方法可以做到这一点?

将列color转换为有序分类,以便按所需的顺序排序,然后按color对值进行排序,最后groupby并获取每个名称的first值:

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

[编辑]:更快的方法可能是做同样的事情,但不是 groupby,只需删除重复的names 并保留第一个(这是函数drop_duplicates的默认值(:

best_color_order = ['White', 'Green', 'Blue', 'Black']
df['color'] = pd.Categorical(df['color'], categories = best_color_order, ordered=True)
df.sort_values('color').drop_duplicates('name')
name  color
0    John  White
7     Tom  Green
10  Jerry   Blue

最新更新