Почему создание нового столбца на фрейме данных Pandas с несортированным индексом происходит медленно - PullRequest
0 голосов
/ 01 марта 2019

Моя цель - выполнить некоторые базовые вычисления с первой встречающейся строкой и назначить ее новому столбцу в фрейме данных.

Для простого примера:

df = pd.DataFrame({k: np.random.randint(0, 1000, 100) for k in list('ABCDEFG')})

# drop duplicates 
first = df.drop_duplicates(subset='A', keep='first').copy()
%timeit first['H'] = first['A']*first['B'] + first['C'] - first['D'].max()

это дает

532 µs ± 5.31 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

если я сбрасываю индекс, он становится почти в 2 раза быстрее (на случай, если разница связана с некоторым кэшированием, я перезагружаюсь с другим порядком несколько раз, это дало тот же результат)

# drop duplicates but reset index
first = df.drop_duplicates(subset='A', keep='first').reset_index(drop=True).copy()
%timeit  first['H'] = first['A']*first['B'] + first['C']

342 µs ± 7.47 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Хотя это не та разница в сумке, мне интересно, что вызывает это.Спасибо.

ОБНОВЛЕНИЕ :

Я переделал этот простой тест, проблема не связана с индексом, похоже, что-то связано с копией фрейма данных:

In [1]: import pandas as pd
In [2]: import numpy as np

In [3]: df = pd.DataFrame({k: np.random.randint(0, 1000, 100) for k in list('ABCDEFG')})

In [4]: # drop duplicates
   ...: first = df.drop_duplicates(subset='A', keep='first').copy()
   ...: %timeit first['H'] = first['A']*first['B'] + first['C'] - first['D'].max()
558 µs ± 11.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [5]: # drop duplicates
   ...: first = df.drop_duplicates(subset='A', keep='first')
   ...: %timeit first['H'] = first['A']*first['B'] + first['C'] - first['D'].max()
/Users/sam/anaconda3/bin/ipython:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  #!/Users/sam_dessa/anaconda3/bin/python
20.7 ms ± 826 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

Создание копии и назначение нового столбца заняло ~ 532 мкс , но непосредственная работа с самим кадром данных (о чем также предупредили панды) дала 20,7 мс ,тот же самый оригинальный вопрос, что вызывает это?Это просто потому, что время, потраченное на выбрасывание предупреждения?

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