Моя цель - выполнить некоторые базовые вычисления с первой встречающейся строкой и назначить ее новому столбцу в фрейме данных.
Для простого примера:
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 мс ,тот же самый оригинальный вопрос, что вызывает это?Это просто потому, что время, потраченное на выбрасывание предупреждения?