Ответ 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, создавая список, тогда создание кадра сразу на несколько порядков быстрее, чем выполнение любой формы назначения. Назначение подразумевает копирование. Создавая сразу все копии только один раз.