Я хотел бы как можно лучше сделать пример загрузки 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
?