2016-12-16 34 views
0

我的問題是非常相似的一個張貼在這裏:Determine mean value of ‘data’ where the highest number of CONTINUOUS cond=True排名最高的連續行,其中值爲True

已經由@Divakar經過精心解決。但是,我有一些不同的需求。而不是最高的最高值,我怎麼能得到 - 第二高,第三高等排名?

一種解決方法是與已經位居值依次降低原有陣列和反覆運行@Divakar解決方案,但我想知道如果任何人有一個更有效的解決方案

+1

前面有一個1 .argsort的每次出現( )[ - 3]' –

回答

0

而不是

res[res['count'] == res['count'].max()] 

您可以使用

res[res['count'] == res['count'].sort_values().unique()[-n]] 

對於任何n你想要的。

+0

這並不回答問題的具體情況。它只要求那些具有連續True值的行的那組行。 –

+0

@TedPetrou我懶惰,只是告訴他他需要改變鏈接的問題 – maxymoo

0

您需要將組編號附加到每個連續的行集。一些棘手的邏輯將顯示以下內容是通過以下語句完成的。該邏輯是基於使用diff找到,如果你想使用@ Divakar的回答只是改變了`argmax`線'(停止 - 起動)由0

# create fake data 
import pandas as pd 
import numpy as np 

np.random.seed(2) 
df = pd.DataFrame({'cond':np.random.choice([True, False], 100), 
        'data':np.random.rand(100)}) 

print(df.head(15)) 

    cond  data 
0 True 0.544208 
1 False 0.082095 
2 False 0.366342 
3 True 0.850851 
4 True 0.406275 
5 False 0.027202 
6 True 0.247177 
7 False 0.067144 
8 True 0.993852 
9 False 0.970580 
10 True 0.800258 
11 False 0.601817 
12 False 0.764960 
13 False 0.169225 
14 False 0.293023 

# add a group column 
df['group'] = ((np.where(df.cond.diff() > 0, 1, 0) * df.cond).cumsum() + 
       df.cond.iloc[0]) * df.cond 

print(df.head()) 

    cond  data group 
0 True 0.544208  1 
1 False 0.082095  0 
2 False 0.366342  0 
3 True 0.850851  2 
4 True 0.406275  2 
5 False 0.027202  0 
6 True 0.247177  3 
7 False 0.067144  0 
8 True 0.993852  4 
9 False 0.970580  0 
10 True 0.800258  5 
11 False 0.601817  0 
12 False 0.764960  0 
13 False 0.169225  0 
14 False 0.293023  0 

# get answer with grouping and sorting 
df_final = df.query('group != 0').groupby('group')['data']\ 
           .agg(['count', 'mean'])\ 
           .sort_values('count', ascending=False) 

print(df_final.head()) 
     count  mean 
group     
18  10 0.529819 
11   8 0.630232 
10   4 0.301558 
16   4 0.215376 
6   4 0.563013 

# get result with .iloc 
# if you care about ties you can select those rows that all have 
# the third highest count 
df.iloc[[2]] 
     count  mean 
group     
10   4 0.301558