Использование функции преобразования в pandas dataframe, которая возвращает новое значение в каждую строку фрейма данных

#python #pandas #dataframe #transform

#python #pandas #фрейм данных #преобразование

Вопрос:

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

 import pandas as pd
import numpy as np
import math


data = {'EVENT_ID': [112335580,112335580,112335580,112335580,112335580,112335580,112335580,112335580, 112335582,
                     112335582,112335582,112335582,112335582,112335582,112335582,112335582,112335582,112335582,
                     112335582,112335582,112335582],

 'SELECTION_ID': [6356576,2554439,2503211,6297034,4233251,2522967,5284417,7660920,8112876,7546023,8175276,8145908,
                  8175274,7300754,8065540,8175275,8106158,8086265,2291406,8065533,8125015],

 'BSP': [5.080818565,6.651493872,6.374683435,24.69510797,7.776082305,11.73219964,270.0383021,4,8.294425408,335.3223613,
         14.06040142,2.423340019,126.7205863,70.53780982,21.3328554,225.2711962,92.25113066,193.0151362,3.775394142,
         95.3786641,17.86333041],

  'WIN_LOSE':[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0]}

df = pd.DataFrame(data, columns=['EVENT_ID', 'SELECTION_ID', 'BSP','WIN_LOSE'])

df = df.sort_values(["EVENT_ID","BSP"])
df.set_index(['EVENT_ID', 'SELECTION_ID'], inplace=True)

df['Win_Percentage'] = 1/df['BSP']

df['Lose_Percentage'] = 1 - df['Win_Percentage']
  

Я хотел бы применить следующую функцию к столбцу Lose_Percentage :

 def test(df):

    x_list = df.values

    y_list = []

    for x in x_list:
        y = math.sin(x/1000)*2000

    return y
  

Для этого я использую функцию преобразования, подобную такой:

 df['Fit'] = df.groupby(level=0)['Lose_Percentage'].transform(test)
  

Проблема в том, что она возвращает одно и то же значение для каждой строки df['Fit'] столбца. Я хотел бы, чтобы она возвращала значение, взятое из этой строки в df['Lose_Percentage'] столбце, и добавляла это в новый df['Fit'] столбец.

Если это сделано правильно, df['Fit'] столбец будет содержать значения для индекса 112335580 :

  [1.499999859375004, 1.6063624685814168, 1.6862587304992693, 1.6993154622916136, 1.742800855666326, 1.8295287282081318, 1.9190120053704878, 1.992593313611782]
  

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

 def test(df):

    x_list = df.values

    y_list = []

    for x in x_list:
        y = math.sin(x/1000)*2000

        y_list.append(y)

    for fit in y_list:

        return fit
  

Но это возвращает то же самое, что и предыдущая попытка. Я также попытался изменить отступ в команде return, но это тоже не сработало.

Ответ №1:

Верьте или нет, то, что вы хотите, так просто, как

 df['Fit'] = np.sin(df['Lose_Percentage'] / 1000) * 2000
  

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

1. Ах … pandas удивительно прост.