Разница в производительности при Pandas запросе данных - PullRequest
0 голосов
/ 09 апреля 2020

Допустим, у меня есть фрейм данных

purchase_1 = pd.Series({'Name': 'Chris',
                        'Item Purchased': 'Dog Food',
                        'Cost': 22.50})
purchase_2 = pd.Series({'Name': 'Kevyn',
                        'Item Purchased': 'Kitty Litter',
                        'Cost': 2.50})
purchase_3 = pd.Series({'Name': 'Vinod',
                        'Item Purchased': 'Bird Seed',
                        'Cost': 5.00})

df = pd.DataFrame([purchase_1, purchase_2, purchase_3], index=['Store 1', 'Store 1', 'Store 2'])

Мой вопрос заключается в том, есть ли какие-либо проблемы с производительностью или разница между этими двумя блоками кода

#code number 1
%time
print(df[df['Cost'] > 3]['Name'])
OUT[3]:CPU times: user 6 µs, sys: 2 µs, total: 8 µs
      Wall time: 14.8 µs

#Code number 2
%time
print(df['Name'][df['Cost'] > 3])
OUT[4]:CPU times: user 4 µs, sys: 0 ns, total: 4 µs
       Wall time: 7.39 µs

Ответы [ 2 ]

4 голосов
/ 09 апреля 2020

В коде 1 вы сначала разбиваете на части, возвращая фрейм данных, а затем получаете серию. Во втором коде вы получаете серию и разбиваете ее на части, поскольку ряд всегда меньше, чем фрейм данных, второй код работает быстрее. Это почти незаметно в таком маленьком случае, как этот, но если бы у вас был огромный набор данных с большим количеством столбцов, второй код был бы намного быстрее.

Я бы рекомендовал использовать .loc, как сказал @EricTruett, здесь это сравнение между 3:

%%timeit -n 1000
df[df['Cost'] > 3]['Name']
397 µs ± 18.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%%timeit -n 1000
df['Name'][df['Cost'] > 3]
306 µs ± 54.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%%timeit -n 1000
df.loc[df['Cost'] > 3, 'Name']
235 µs ± 19.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
1 голос
/ 10 апреля 2020

Просто для полноты я добавил %timeit (df.query('Cost > 3').Name)

%timeit (df[df['Cost'] > 3]['Name'])

%timeit (df['Name'][df['Cost'] > 3])

%timeit (df.query('Cost > 3').Name)

%timeit (df.loc[df['Cost'] > 3, 'Name'])

, в результате чего

417 µs ± 11.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
267 µs ± 8.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
1.21 ms ± 22.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
224 µs ± 4.88 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
...