我有像这样的数据框
Name Shop Sales
a First 10
c Second 5
b First 8
d Second 4
e Third 30
g First 11
我希望从“名称”列中获取“销售”列中值最高的值,按“商店”分组并排序以使最高值“销售”。 所以实际上我想回复这个:
Third e 30
First g 11
Second c 5
我设法做到了:
grouped=df.groupby(['Shop'], sort=False)['Sales'].max()
grouped.sort_index(ascending=False)
产生:
Third 30
First 11
Second 5
但我不确定如何访问它的相应名称。有什么想法吗?
答案 0 :(得分:2)
您可以使用DataFrameGroupBy.idxmax
作为max
Sales
值的索引,然后按loc
和sort_values
进行选择:
print (df.groupby('Shop')['Sales'].idxmax())
Shop
First 5
Second 1
Third 4
Name: Sales, dtype: int64
print (df.loc[df.groupby('Shop')['Sales'].idxmax()].sort_values('Sales', ascending=False))
Name Shop Sales
4 e Third 30
5 g First 11
1 c Second 5
答案 1 :(得分:1)
您可以使用nlargest
方法:
In [115]: df.groupby('Shop', as_index=False) \
.apply(lambda x: x.nlargest(1, columns='Sales')) \
.reset_index(level=0, drop=True)
Out[115]:
Name Shop Sales
5 g First 11
1 c Second 5
4 e Third 30
或者,如果您不需要原始索引值 - 这是@jezrael的更好方法:
In [122]: df.set_index('Name').groupby('Shop')['Sales'].nlargest(1).reset_index()
Out[122]:
Shop Name Sales
0 First g 11
1 Second c 5
2 Third e 30