Подтвердить что ты не робот

Рисование образца бутстрапа из pandas.DataFrame

Я хотел бы как можно лучше сделать пример загрузки pandas.DataFrame. Использование встроенного iloc вместе со списком целых чисел кажется медленным:

import pandas
import numpy as np
# Generate some data
n = 5000
values = np.random.uniform(size=(n, 5))
# Construct a pandas.DataFrame
columns = ['a', 'b', 'c', 'd', 'e']
df = pandas.DataFrame(values, columns=columns)
# Bootstrap
%timeit df.iloc[np.random.randint(n, size=n)]
# Out: 1000 loops, best of 3: 1.46 ms per loop

Индексирование массива numpy, конечно, намного быстрее:

%timeit values[np.random.randint(n, size=n)]
# Out: 10000 loops, best of 3: 159 µs per loop

Но даже извлечение значений, выборка массива numpy и построение нового pandas.DataFrame выполняется быстрее:

%timeit pandas.DataFrame(df.values[np.random.randint(n, size=n)], columns=columns)
# Out: 1000 loops, best of 3: 302 µs per loop

@JohnE предложил sample, который, к сожалению, еще медленнее:

%timeit df.sample(n, replace=True)
# Out: 100 loops, best of 3: 5.14 ms per loop

@firelynx предложил merge:

%timeit df.merge(pandas.DataFrame(index=np.random.randint(n, size=n)), left_index=True, right_index=True, how='right')
# Out: 1000 loops, best of 3: 1.23 ms per loop

Есть ли у кого-нибудь идея, почему iloc настолько медленная и/или есть лучшие альтернативы, чем извлечение значений, выборка и последующее построение нового pandas.DataFrame?

4b9b3361

Ответ 1

Метод слияния в pandas довольно оптимизирован, поэтому я попробовал удачу, и это дало мне значительное увеличение скорости. Учитывая, что моя машина немного медленнее, чем ваша, я также использую pandas 0.15.2. Все может быть немного иначе.

%timeit df.iloc[np.random.randint(n, size=n)]
# 100 loops, best of 3: 2.41 ms per loop

randlist = pandas.DataFrame(index=np.random.randint(n, size=n))
%timeit df.merge(randlist, left_index=True, right_index=True, how='right')
# 1000 loops, best of 3: 1.87 ms per loop

%timeit df.merge(pandas.DataFrame(index=np.random.randint(n, size=n)), left_index=True, right_index=True, how='right')
# 100 loops, best of 3: 2.29 ms per loop

Ответ 2

Скорость индексирования

Булевая индексация протестирована для меня немного быстрее:

Булевское индексирование

%timeit -n10000 df[np.random.randint(2, size=n).astype(bool)]
# 10000 loops, best of 3: 307 µs per loop

numpy выборки и re DataFrame ing

%timeit -n10000 pandas.DataFrame(df.values[np.random.randint(n, size=n)], columns=columns)
# 10000 loops, best of 3: 380 µs per loop