#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