Создание нового столбца DF на основе средних значений из определенных столбцов, определенных во втором столбце DF

#python #pandas #dataframe

Вопрос:

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

У меня есть два кадра данных. Первый содержит игроков и их статистику. Вторая содержит список противников каждого игрока в течение сезона.

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

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

Первый фрейм данных (df) содержит пять столбцов. Имя, STAT1, STAT2, STAT3 и STAT4.

Второй фрейм данных (df_Schedule) имеет столбец имени, но затем имеет отдельный столбец для каждого встречного противника. df_Schedule обычно содержит разное количество столбцов в зависимости от недели сезона. Например, после 1-й недели может быть четыре столбца. После 26-й недели может быть 100 столбцов. Для простоты я включил всего пять столбцов [«Имя», «Opp1», «Opp2», «Opp3», «Opp4», «Opp5»].

Используя эти два фрейма данных, я пытаюсь создать новые столбцы в первом фрейме данных (df). EXP1 (для «Ожидаемого СОСТОЯНИЯ 1»), EXP2, EXP3, EXP4. Ожидаемые столбцы-это просто среднее значение столбцов статистики, основанное на противниках, с которыми вы сталкивались в течение сезона. Например, Эдгар трижды сталкивался с Ральфом, один раз с Марком и один раз с Дэвидом. Формула для расчета EXP1 Эдгара проста:

((Ральф.СТАТ1 * 3) (Марк.СТАТ1 * 1) (Дэвид.STAT1 * 1) / Number_of_Contests (в данном примере их пять) = 100,2

 import pandas as pd


data = {'Name':['Edgar', 'Ralph', 'Marc', 'David'],
        'STAT1':[100, 96, 110, 103],
       'STAT2':[116, 93, 85, 100],
       'STAT3':[56, 59, 41, 83],
       'STAT4':[55, 96, 113, 40],}

data2 = {'Name':['Edgar', 'Ralph', 'Marc', 'David'],
        'Opp1':['Ralph', 'Edgar', 'David', 'Marc'],
       'Opp2':['Ralph', 'Edgar', 'David', 'Marc'],
       'Opp3':['Marc', 'David', 'Edgar', 'Ralph'],
       'Opp4':['David', 'Marc', 'Ralph', 'Edgar'],
        'Opp5':['Ralph', 'Edgar', 'David', 'Marc'],}

df = pd.DataFrame(data)

df_Schedule = pd.DataFrame(data2)



print(df)

print(df_Schedule)
 

Я бы хотел, чтобы результат был примерно таким:

 data_Final = {'Name':['Edgar', 'Ralph', 'Marc', 'David'],
        'STAT1':[100, 96, 110, 103],
       'STAT2':[116, 93, 85, 100],
       'STAT3':[56, 59, 41, 83],
       'STAT4':[55, 96, 113, 40],
       'EXP1':[100.2, 102.6, 101, 105.2],
       'EXP2':[92.8, 106.6, 101.8, 92.8],
       'EXP3':[60.2, 58.4, 72.8, 47.6],
       'EXP4':[88.2, 63.6, 54.2, 98],}

df_Final = pd.DataFrame(data_Final)

print(df_Final)
 

Есть ли способ использовать фрейм данных планирования для поиска значений оппонентов, усреднения их, а затем создания нового столбца на основе этих средних значений?

Ответ №1:

Попробуй:

 df = df.set_index("Name")
df_Schedule = df_Schedule.set_index("Name")

for i, c in enumerate(df.filter(like="STAT"), 1):
    df[f"EXP{i}"] = df_Schedule.replace(df[c]).mean(axis=1)

print(df.reset_index())
 

С принтами:

     Name  STAT1  STAT2  STAT3  STAT4   EXP1   EXP2  EXP3  EXP4
0  Edgar    100    116     56     55  100.2   92.8  60.2  88.2
1  Ralph     96     93     59     96  102.6  106.6  58.4  63.6
2   Marc    110     85     41    113  101.0  101.8  72.8  54.2
3  David    103    100     83     40  105.2   92.8  47.6  98.0