Получите правильные края категорий pandas эффективно - PullRequest
1 голос
/ 28 марта 2020

Как можно эффективно получить pandas интервал Категории правых граней? В приведенном ниже примере, как можно эффективно создать z?

import pandas as pd, numpy as np
bins = pd.interval_range(start=0, end=4, freq=1, closed='left')
x = pd.Series(np.linspace(0.0,3.8,num=20))
y = pd.cut(x, bins)

# How can one create z efficiently?
z = pd.Series(y.iat[n].right for n in range(len(y)))

Спасибо за помощь!

1 Ответ

1 голос
/ 28 марта 2020

Для эффективного подхода вы можете использовать np.bincount:

np.digitize(x, range(0,4))
# array([1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4])

Для pd.Series:

pd.Series(np.digitize(x, range(0,4)), index=x.index)

0     1
1     1
2     1
3     1
4     1
5     1
6     2
7     2
8     2
9     2
10    2
11    3
...

Время включения больший массив данных -

bins = pd.interval_range(start=0, end=400, freq=1, closed='left')
x = pd.Series(np.linspace(0.0,380,num=20_000))

%timeit pd.Series(np.digitize(x, range(0,400)))
# 567 µs ± 28.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

def op(x):
    y = pd.cut(x, bins)
    z = pd.Series(y.iat[n].right for n in range(len(y)))

%timeit op(x)
# 682 ms ± 49.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Где оба дают одно и то же:

np.allclose(op(x), pd.Series(np.digitize(x, range(0,400))))
# True

Так что для намного большего кадра данных из 20000 строк мы получаем ускорение 1200x

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...