#pandas
#pandas
Вопрос:
Простая строка кода df.iloc[100] = df.iloc[500]
становится очень медленной в большом фрейме данных со смешанными типами из-за того, что pandas копирует целые столбцы (нашел это в исходном коде). Чего я не понимаю, так это зачем необходимо такое поведение и как его избежать и заставить pandas просто обновлять соответствующие значения, если я заранее уверен, что dtypes совпадают. Когда DF имеет один тип, копирование не выполняется, и значения изменяются на месте.
Я нашел обходной путь, который, кажется, дает желаемый эффект, но он работает только с номерами строк:
for c in df.columns:
df[c].array[100] = df[c].array[500]
Это буквально в 1000 раз быстрее, чем df.iloc[100] = df.iloc[500]
.
Вот как воспроизвести медлительность присваивания:
import string
import itertools
import timeit
import numpy as np
import pandas as pd
data = list(itertools.product(range(200_000), string.ascii_uppercase))
df = pd.DataFrame(data, columns=['i', 'p'])
df['n1'] = np.random.randn(len(df))
df['n2'] = np.random.randn(len(df))
df['n3'] = np.random.randn(len(df))
df['n4'] = np.random.randn(len(df))
print(
timeit.timeit('df.loc[100] = df.loc[500]', number=100, globals=globals()) / 100
)
df_o = df.copy()
# Remove mixed types
for c in df_o.columns:
df_o[c] = df_o[c].astype('object')
print(
timeit.timeit('df_o.loc[100] = df_o.loc[500]', number=100, globals=globals()) / 100
)
Только этот пример показывает разницу в производительности в 10 раз. Я все еще не до конца понимаю, почему даже при несмешанных типах назначение одной строки происходит довольно медленно.