Наиболее эффективный метод обновления нескольких столбцов в одной строке фрейма данных

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

line_profiler показывает мне удивительный (для меня) результат, заключающийся в том, что обновление двух столбцов в одной строке выполняется быстрее как два оператора, а не как один комбинированный оператор.

 Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
   696      6907   42029943.0   6085.1      4.7    df_work.loc[self.iRow, 'status'] = 'X'
   697      6907   68856814.0   9969.1      7.7    df_work.loc[self.iRow, 'clock'] = self.dClock
   698      6907  178155598.0  25793.5     19.9    df_work.loc[self.iRow, ['status', 'clock']] = ['L', self.dClock]
 

Строки 696 и 697 занимают в совокупности 11 секунд против 18 секунд для эквивалентной строки 698, поэтому 2 отдельных обновления выполняются на 40% быстрее, чем один оператор обновления. Я вижу этот шаблон неоднократно. Я предположил, что однократное обновление будет выполняться быстрее, и прежде чем я верну свой код обратно, я хочу проверить, существует ли еще более эффективный метод обновления по одному столбцу за раз в строке. Спасибо!

Ответ №1:

После дальнейших исследований решением было переключиться на iat вместо loc.

 Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
   673      6907    5209397.0    754.2      1.7  df_work.iat[self.iRow, cols_work['clock']] = self.dClock
 

Время одного попадания уменьшилось с 9969 до 754.

Я инициализировал словарь, чтобы преобразовать имя столбца в номер столбца для использования с iat следующим образом:

     cols_work = {}
    for col in df_work.columns:
        cols_work[col] = len(cols_work)