2017-10-11 54 views
0

的列表(我學習大熊貓,所以請解釋溶液)熊貓 - 如何獲得

我的數據是這樣的:

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最高的頂級項目(例如前10名)。

沒了主意,放棄了,並試圖用手爲每個類別做到這一點,我曾嘗試:

df[(df['ClosePrice']> 93) & ([df.Category == 'Automotive'])] 

...但沒有奏效。我得到的錯誤是:

ValueError: operands could not be broadcast together with shapes (351550,) (1975,) 

我也探討了交叉表,但它不是我所期待的。

必須有一種方法可以在一行熊貓代碼中自動執行所需的操作。有什麼建議?謝謝!

回答

0

我會使用nlargest方法:

df.groupby('Category', group_keys=False).apply(lambda x: x.nlargest(10, 'ClosePrice')) 
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)

+0

sort_values按升序排序,本質上給你n個值。另外,請注意您的答案與我的非常相似。 –

+0

感謝您回覆Arthur! – skeitel