Подтвердить что ты не робот

Pandas эффективная строка набора данных

Сначала у меня есть следующий пустой DataFrame prealocated:

df=DataFrame(columns=range(10000),index=range(1000))

Затем я хочу обновить строку df по строке (эффективно) массивом с длиной-10000 в качестве данных. Моя проблема: я даже не знаю, какой метод DataFrame я должен использовать для выполнения этой задачи.

Спасибо!

4b9b3361

Ответ 1

Здесь 3 метода, всего 100 столбцов, 1000 строк

In [5]: row = np.random.randn(100)

Правильное назначение

In [6]: def method1():
   ...:     df = DataFrame(columns=range(100),index=range(1000))
   ...:     for i in xrange(len(df)):
   ...:         df.iloc[i] = row
   ...:     return df
   ...: 

Создайте массивы в списке, сразу создайте фрейм

In [9]: def method2():
   ...:     return DataFrame([ row for i in range(1000) ])
   ...: 

Колонное присвоение (с транспонированием с обоих концов)

In [13]: def method3():
   ....:     df = DataFrame(columns=range(100),index=range(1000)).T
   ....:     for i in xrange(1000):
   ....:         df[i] = row
   ....:     return df.T
   ....: 

Все они имеют одинаковый выходной кадр

In [22]: (method2() == method1()).all().all()
Out[22]: True

In [23]: (method2() == method3()).all().all()
Out[23]: True


In [8]: %timeit method1()
1 loops, best of 3: 1.76 s per loop

In [10]: %timeit method2()
1000 loops, best of 3: 7.79 ms per loop

In [14]: %timeit method3()
1 loops, best of 3: 1.33 s per loop

Это CLEAR, создавая список, тогда создание кадра сразу на несколько порядков быстрее, чем выполнение любой формы назначения. Назначение подразумевает копирование. Создавая сразу все копии только один раз.

Ответ 2

df=DataFrame(columns=range(10),index=range(10))
a = np.array( [9,9,9,9,9,9,9,9,9,9] )

Обновить строку:

df.loc[2] = a

Использование идеи Джеффа...

df2 = DataFrame(data=np.random.randn(10,10), index=arange(10))
df2.head().T

Я написал записную книжку, отвечая на вопрос: https://www.wakari.io/sharing/bundle/hrojas/pandas%20efficient%20dataframe%20set%20row