我希望根据客户对pandas数据框进行分组,根据数量对其进行排序,并返回包含数量第二高值的整个行。
我有这样的东西:
customer item quantity
0 A p 5
1 A p 8
2 A q 9
3 A q 2
4 B p 3
5 B p 6
我能够返回一个包含行与最大数量的数据帧。我使用:
idx=df.groupby(by='customer')['quantity'].idxmax()
df_max=df.loc[idx,]
返回如下数据帧:
customer item quantity
2 A q 9
5 B p 6
但是,我还需要一个数量第二高的Dataframe,我被难住了。
我希望返回的数据框看起来像这样:
customer item quantity
1 A p 8
4 B p 3
谢谢!
您可以尝试pandas.core.groupby.GroupBy.nth
从已排序的数据框中取第n行,注意索引从0开始。
out = (df.sort_values('quantity', ascending=False)
.groupby('customer', as_index=False).nth(1))
print(out)
customer item quantity
1 A p 8
4 B p 3
df.groupby("customer").agg({'quantity': list}).apply(lambda x: sorted(x.quantity)[-2], axis=1)