#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