Выбор мин из групп в серии панд - PullRequest
2 голосов
/ 12 июня 2019

У меня есть серия панд, которая выглядит так

>>> print(x)
0     1
1     2
2     3
3     4
4     0
5     0
6     0
7     0
8     9
9     6
10    3
11    5
12    7
Name: c, dtype: int64

Я хочу найти минимальное значение из каждой группы чисел, которые не равны нулю, возможно, я не объясняю это замечательно, поэтому мне бы хотелось, чтобы результат выглядел следующим образом

>>> print(result)
0     1
1     1
2     1
3     1
4     0
5     0
6     0
7     0
8     3
9     3
10    3
11    3
12    3
Name: c, dtype: int64

Ответы [ 2 ]

3 голосов
/ 12 июня 2019

for и Нумба

Я хочу использовать цикл for, но ускорить его с помощью Numba

  • Да: это for петля и не очень красивая
  • Нет: это не медленно, потому что я использую Numba (-:

Импорт

import pandas as pd
import numpy as np
from numba import njit

Определить функцию

@njit
def f(x):
    y = []
    z = []
    for a in x:
        if not y:
            y.append(a)
            z.append(0)
        else:
            if (y[-1] == 0) ^ (a == 0):
                y.append(a)
                z.append(z[-1] + 1)
            else:
                y[-1] = min(y[-1], a)
                z.append(z[-1])
    return np.array(y)[np.array(z)]

Использовать функцию

pd.Series(f(x.to_numpy()), x.index)

0     1
1     1
2     1
3     1
4     0
5     0
6     0
7     0
8     3
9     3
10    3
11    3
12    3
dtype: int64

itertools.groupby

Кредит на номер 6 для ассистента.

from itertools import groupby, repeat

def repeat_min(x):
    for _, group in groupby(x, key=bool):
        group = list(group)
        minval = min(group)
        yield from repeat(minval, len(group))

pd.Series([*repeat_min(x)], x.index)

0     1
1     1
2     1
3     1
4     0
5     0
6     0
7     0
8     3
9     3
10    3
11    3
12    3
dtype: int64
3 голосов
/ 12 июня 2019

Используйте трюк shift ing cumsum, затем позвоните GroupBy.transform:

u = x.eq(0)
x.groupby(u.ne(u.shift()).cumsum()).transform('min')

0     1
1     1
2     1
3     1
4     0
5     0
6     0
7     0
8     3
9     3
10    3
11    3
12    3
Name: 1, dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...