Обновление одной строки происходит медленно при смешанных типах в pandas

#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 раз. Я все еще не до конца понимаю, почему даже при несмешанных типах назначение одной строки происходит довольно медленно.