Панды: найдите n самых низких значений каждые m строк - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть фрейм данных со счетчиком, который увеличивается на 1 каждые 24 строки, и столбец значений, как показано ниже.

    value   counter
0   0.00    1
1   0.00    1
2   0.00    1
3   0.00    1
4   0.00    1
5   0.00    1
6   0.00    1
7   0.00    1
8   55.00   1
9   90.00   1
10  49.27   1
11  51.80   1
12  49.06   1
13  43.46   1
14  45.96   1
15  43.95   1
16  45.00   1
17  43.97   1
18  42.00   1
19  41.14   1
20  43.92   1
21  51.74   1
22  40.85   1
23  0.00    2
24  0.00    2
25  0.00    2
26  0.00    2
27  0.00    2
28  0.00    2
29  0.00    2
...     ...     ...
187     82.38   9
188     66.89   9
189     59.83   9
190     52.46   9
191     40.48   9
192     28.87   9
193     41.90   9
194     42.56   9
195     40.93   9
196     40.02   9
197     36.54   9
198     33.70   9
199     38.99   9
200     46.10   9
201     44.82   9
202     0.00    9
203     0.00    9
204     0.00    9
205     0.00    9
206     0.00    9
207     0.00    10
208     0.00    10
209     0.00    10
210     74.69   10
211     89.20   10
212     74.59   10
213     55.11   10
214     58.39   10
215     40.81   10
216     45.06   10

Я хотел бы знать, есть ли способ создать третий столбецс 4 самыми низкими значениями в каждой группе, где счетчик имеет одинаковое значение.Ниже приведен пример для первой группы с счетом = 1:

 value counter value 2
0   0.00    1   0.00
1   0.00    1   0.00
2   0.00    1   0.00
3   0.00    1   0.00
4   0.00    1   0.00
5   0.00    1   0.00
6   0.00    1   0.00
7   0.00    1   0.00
8   55.00   1   0.00
9   90.00   1   0.00
10  49.27   1   0.00
11  51.80   1   0.00
12  49.06   1   0.00
13  43.46   1   43.46
14  45.96   1   0.00
15  43.95   1   0.00
16  45.00   1   0.00
17  43.97   1   0.00
18  42.00   1   42.00
19  41.14   1   41.14
20  43.92   1   0.00
21  51.74   1   0.00
22  40.85   1   40.85

Я знаю о некоторых функциях, таких как nsmallest(n,'column'), но я не знаю, как ограничить ее с помощью группы счетчиков

Любая идея?заранее спасибо!.

1 Ответ

0 голосов
/ 29 ноября 2018

Я думаю, что вам нужно сначала отфильтровать строки со значениями 0 в value, отсортировать по sort_values и получить DataFrame.head для верхних 4 значений,последнее добавление reindex для заполнения 0 для несоответствующих значений:

df['value 2'] = (df[df['value'] != 0]
                   .sort_values('value')
                   .groupby('counter')['value'].head(4)
                   .reindex(df.index, fill_value=0))

print (df)
    value  counter  value 2
0    0.00        1     0.00
1    0.00        1     0.00
2    0.00        1     0.00
3    0.00        1     0.00
4    0.00        1     0.00
5    0.00        1     0.00
6    0.00        1     0.00
7    0.00        1     0.00
8   55.00        1     0.00
9   90.00        1     0.00
10  49.27        1     0.00
11  51.80        1     0.00
12  49.06        1     0.00
13  43.46        1    43.46
14  45.96        1     0.00
15  43.95        1     0.00
16  45.00        1     0.00
17  43.97        1     0.00
18  42.00        1    42.00
19  41.14        1    41.14
20  43.92        1     0.00
21  51.74        1     0.00
22  40.85        1    40.85
23   0.00        2     0.00
24   0.00        2     0.00
25   0.00        2     0.00
26   0.00        2     0.00
27   0.00        2     0.00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...