Применение функции к фрагментам фрейма данных

#python #pandas #dataframe #resampling

#python #pandas #фрейм данных #Повторная выборка

Вопрос:

У меня есть Dataframe (df) (например, упрощенная версия)

               A    B 
 0           2.0   3.0
 1           3.0   4.0
  

и сгенерировал 20 повторных выборок начальной загрузки, которые все теперь находятся в одном и том же df, но отличаются номером повторной выборки .

                                 A    B 
   
0     1             0           2.0   3.0
1     1             1           3.0   4.0
2     2             1           3.0   4.0
3     2             1           3.0   4.0
..    ..
..    .. 
39    20            0           2.0    3.0
40    20            0           2.0    3.0
  

Теперь я хочу применить определенную функцию к каждому номеру повторной выборки. Скажем:

 C = sum(df['A'] * df['B']) / sum(df['B'] ** 2)
  

Внешний вид будет выглядеть следующим образом:

                                  A    B           C
0     1             0           2.0   3.0   Calculated Value X1
1     1             1           3.0   4.0   Calculated Value X1
2     2             1           3.0   4.0   Calculated Value X2
3     2             1           3.0   4.0   Calculated Value X2
..    ..
..    .. 
39    20            0           2.0    3.0  Calculated Value  X20
40    20            0           2.0    3.0  Calculated Value  X20
  

Итак, есть 20 разных новых значений.

Я знаю, что есть df.команда iloc, в которой я могу указать свой выбор строки df.iloc[row, column] но я хотел бы найти команду, в которой мне не нужно повторять код для 20 образцов. Моя цель — найти команду, которая автоматически определяет номер повторной выборки, а затем вычисляет функцию для каждого номера повторной выборки

Как я могу это сделать?

Спасибо!

Комментарии:

1. Пожалуйста, исправьте формулу, я думаю, вам не хватает парантезиса.. Также, если возможно, укажите ожидаемый результат для данного образца.

2. Итак, формула такова sum(df['A'] * df['B']) / sum(df['A'] ** 2) , верно?

3. sum(df['A'] * df['B']) / sum(df['B'] ** 2 (отредактировано). Но да, именно так.

Ответ №1:

Используйте DataFrame.assign для создания двух новых столбцов x и y , соответствующих df['A'] * df['B'] и df['B']**2 , затем используйте DataFrame.groupby на Resample Nr. (или level=1 ) и transform с sum помощью:

 s = df.assign(x=df['A'].mul(df['B']), y=df['B']**2)
      .groupby(level=1)[['x', 'y']].transform('sum')
df['C'] = s['x'].div(s['y'])
  

Результат:

            A    B         C
0  1  0  2.0  3.0  0.720000
1  1  1  3.0  4.0  0.720000
2  2  1  3.0  4.0  0.750000
3  2  1  3.0  4.0  0.750000
39 20 0  2.0  3.0  0.666667
40 20 0  2.0  3.0  0.666667