我的问题与此处发布的问题非常相似:Determine mean value of ‘data’ where the highest number of CONTINUOUS cond=True
由@Divakar精心解决。但是,我的需求略有不同。而不是最高的最大值,我怎么能得到 - 排名第二,第三,等等排名?
一种解决方法是使用已经排名的值连续减少原始数组并迭代运行@Divakar解决方案,但我想知道是否有人有更有效的解决方案
答案 0 :(得分:0)
而不是
res[res['count'] == res['count'].max()]
您可以使用
res[res['count'] == res['count'].sort_values().unique()[-n]]
对于你想要的任何n
。
答案 1 :(得分:0)
您需要为每组连续的行附加一个组号。一些棘手的逻辑将表明使用以下语句完成以下操作。该逻辑基于使用diff
来查找每个出现1的前缀为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