2017-09-01 51 views
2

我得到一個數據幀熊貓這樣的:如何選擇熊貓每組的前3行?

id prob 
0 1 0.5 
1 1 0.6 
2 1 0.4 
3 1 0.2 
4 2 0.3 
6 2 0.5 
... 

我想這組由「ID」,排序降序排列,並獲得第3的概率各組。請注意,某些羣體包含的行小於3 最後,我希望得到一個二維數組,如:

[[1, 0.6, 0.5, 0.4], [2, [0.5, 0.3]]...] 

我如何能做到這一點有熊貓嗎? 謝謝!

回答

3

使用sort_valuesgroupbyhead

df.sort_values(by=['id','prob'], ascending=[True,False]).groupby('id').head(3).values 

輸出:

array([[ 1. , 0.6], 
     [ 1. , 0.5], 
     [ 1. , 0.4], 
     [ 2. , 0.5], 
     [ 2. , 0.3]]) 

繼@COLDSPEED鉛:

df.sort_values(by=['id','prob'], ascending=[True,False])\ 
    .groupby('id').agg(lambda x: x.head(3).tolist())\ 
    .reset_index().values.tolist() 

輸出:

[[1, [0.6, 0.5, 0.4]], [2, [0.5, 0.3]]] 
+0

尼斯,與陣列部分仍然:) – Vaishali

+1

@Vaishali掙扎,我想我得到了這種方式。 –

+0

我拿到了一個與NaNs,想不到超越,可能是明天 – Vaishali

3

您可以使用GROUPBY和nlargest

df.groupby('id').prob.nlargest(3).reset_index(1,drop = True) 

id 
1 0.6 
1 0.5 
1 0.4 
2 0.5 
2 0.3 

對於數組

df1 = df.groupby('id').prob.nlargest(3).unstack(1)#.reset_index(1,drop = True)#.set_index('id') 
np.column_stack((df1.index.values, df1.values)) 

你得到

array([[ 1. , 0.5, 0.6, 0.4, nan, nan], 
     [ 2. , nan, nan, nan, 0.3, 0.5]]) 
1

如果您正在尋找陣列列的數據幀,你可以使用np.sort

df = df.groupby('id').prob.apply(lambda x: np.sort(x.values)[:-4:-1]) 
df 

id 
1 [0.6, 0.5, 0.4] 
2   [0.5, 0.3] 

來獲取值,reset_index和訪問:

df.reset_index().values 

array([[1, array([ 0.6, 0.5, 0.4])], 
     [2, array([ 0.5, 0.3])]], dtype=object) 
1
[[n, g.nlargest(3).tolist()] for n, g in df.groupby('id').prob] 

[[1, [0.6, 0.5, 0.4]], [2, [0.5, 0.3]]] 
+1

這就是完全它! – Vaishali

+0

謝謝@Vaishali – piRSquared