(我正在学习熊猫,所以请解释一下解决方案)
我的数据如下:
Category currency sellerRating Duration endDay ClosePrice
0 Music/Movie/Game US 3249 5 Mon 0.01 0.01
1 Music/Movie/Game US 3249 5 Mon 0.01 0.01
2 Music/Movie/Game US 3249 5 Mon 0.01 0.01
3 Music/Movie/Game US 3249 5 Mon 0.01 0.01
4 Music/Movie/Game US 3249 5 Mon 0.01 0.01
Dtypes结果是:
Category object
currency object
sellerRating int64
Duration int64
endDay object
ClosePrice float64
OpenPrice float64
PriceIncrease float64
dtype: object
我试图找出具有最高ClosePrice for EACH类别的顶级(例如前10名)项目。
出于想法,放弃并试图为每个类别手动完成,我尝试过:
df[(df['ClosePrice']> 93) & ([df.Category == 'Automotive'])]
......但它不起作用。我得到的错误是:
ValueError: operands could not be broadcast together with shapes (351550,) (1975,)
我也曾探索过Crosstab,但它并不是我想要的。
必须有一种方法可以在一行Pandas代码中自动执行我想要的操作。有什么建议?谢谢!
答案 0 :(得分:0)
使用groupby然后应用排序仅保留前k个值
top = 10
df.groupby('Category', group_keys=None).apply(lambda x: x.sort_values('ClosePrice')[:top])
由于您要求解释解决方案,我会尝试。
使用groupby
,您可以根据“类别”列创建数据组。每个组都有相同的类别。在此代码适用之后,对于每个组,sort_values
将按ClosePrice对数据进行排序,之后,仅获取最高值。
上面的代码可能会“混乱”。保留原始索引的索引。如果您需要重置索引,则必须使用
df.groupby('Category', group_keys=None).apply(lambda x: x.sort_values('ClosePrice')[:top]).reset_index(drop=True)
答案 1 :(得分:0)
我使用nlargest
方法:
df.groupby('Category', group_keys=False).apply(lambda x: x.nlargest(10, 'ClosePrice'))