Быстро добавить несколько столбцов в кадр данных Pandas

Я пишу некоторый код, чувствительный к производительности, в котором я должен быстро добавить большое количество столбцов в кадр данных Pandas.

Мне удалось получить 3-кратное улучшение по наивному повторению df[foo] = bar , построив второй блок данных из dict и объединив их:

 def mkdf1(n): df = pd.DataFrame(index=range(10,20), columns=list('qwertyuiop')) for i in xrange(n): df['col%d' % i] = range(i, 10+i) return df def mkdf2(n): df = pd.DataFrame(index=range(10,20), columns=list('qwertyuiop')) newcols = {} for i in xrange(n): newcols['col%d' % i] = range(i, 10+i) return pd.concat([df, pd.DataFrame(newcols, index=df.index)], axis=1) 

Сроки показывают существенное улучшение:

 %timeit -r 1 mkdf1(100) 100 loops, best of 1: 16.6 ms per loop %timeit -r 1 mkdf2(100) 100 loops, best of 1: 5.5 ms per loop 

Существуют ли какие-либо другие оптимизации, которые я могу сделать здесь?

EDIT: Кроме того, concat вызов занимает гораздо больше времени в моем реальном коде, чем мой пример с игрушкой; в частности, функция get_result занимает намного больше времени, несмотря на то, что в производстве df меньше строк, и я не могу понять, почему. Любые советы о том, как ускорить это, будут оценены.

One Solution collect form web for “Быстро добавить несколько столбцов в кадр данных Pandas”

Я немного смущен точно, как должен выглядеть ваш фреймворк, но с этим можно легко ускорить это с помощью общей техники. В основном для скорости панд / numpy, которую вы хотите избежать, и любого возможного concat/merge/join/append , если это возможно.

Лучше всего здесь лучше использовать numpy для создания массива, который будет вводить в dataframe, а затем назвать столбцы, как вам нравится. Обе эти операции должны быть тривиальными по времени вычислений.

Вот часть numpy, похоже, вы уже знаете, как создавать имена столбцов.

 %timeit pd.DataFrame( np.ones([10,100]).cumsum(axis=0) + np.ones([10,100]).cumsum(axis=1) ) 10000 loops, best of 3: 158 µs per loop 

Я думаю, вы пытаетесь сделать что-то подобное? (Если нет, просто проверьте numpy, если вы не знакомы с ним, у него есть все виды операций с массивами, которые должны сделать очень легким сделать то, что вы пытаетесь сделать здесь).

 In [63]: df.ix[:5,:10] Out[63]: 0 1 2 3 4 5 6 7 8 9 10 0 2 3 4 5 6 7 8 9 10 11 12 1 3 4 5 6 7 8 9 10 11 12 13 2 4 5 6 7 8 9 10 11 12 13 14 3 5 6 7 8 9 10 11 12 13 14 15 4 6 7 8 9 10 11 12 13 14 15 16 5 7 8 9 10 11 12 13 14 15 16 17 
  • Для каждой строки, какой самый быстрый способ найти столбец, содержащий n-й элемент, который не является NaN?
  • Что происходит в функции журнала numpy? Есть ли способы улучшить производительность?
  • Ускорьте Pandas cummin / cummax
  • различия в производительности при работе в Linux и Windows
  • Являются ли кортежи более эффективными, чем списки в Python?
  • Использование __slots__ под PyPy
  • Julia Neural Network код такой же скорости, как PyPy
  • Есть ли функция в Django / Python, похожая на PHP flush (), которая позволяет мне отправлять часть ответа HTTP клиентам?
  • Python - лучший язык программирования в мире.