我的問題是非常相似的一個張貼在這裏:Determine mean value of ‘data’ where the highest number of CONTINUOUS cond=True排名最高的連續行,其中值爲True
已經由@Divakar經過精心解決。但是,我有一些不同的需求。而不是最高的最高值,我怎麼能得到 - 第二高,第三高等排名?
一種解決方法是與已經位居值依次降低原有陣列和反覆運行@Divakar解決方案,但我想知道如果任何人有一個更有效的解決方案
我的問題是非常相似的一個張貼在這裏:Determine mean value of ‘data’ where the highest number of CONTINUOUS cond=True排名最高的連續行,其中值爲True
已經由@Divakar經過精心解決。但是,我有一些不同的需求。而不是最高的最高值,我怎麼能得到 - 第二高,第三高等排名?
一種解決方法是與已經位居值依次降低原有陣列和反覆運行@Divakar解決方案,但我想知道如果任何人有一個更有效的解決方案
而不是
res[res['count'] == res['count'].max()]
您可以使用
res[res['count'] == res['count'].sort_values().unique()[-n]]
對於任何n
你想要的。
這並不回答問題的具體情況。它只要求那些具有連續True值的行的那組行。 –
@TedPetrou我懶惰,只是告訴他他需要改變鏈接的問題 – maxymoo
您需要將組編號附加到每個連續的行集。一些棘手的邏輯將顯示以下內容是通過以下語句完成的。該邏輯是基於使用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
前面有一個1 .argsort的每次出現( )[ - 3]' –