熊猫 - 如何获得列表

时间:2017-10-11 19:21:34

标签: python pandas pandas-groupby

(我正在学习熊猫,所以请解释一下解决方案)

我的数据如下:

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代码中自动执行我想要的操作。有什么建议?谢谢!

2 个答案:

答案 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'))