#python #dataframe
#python #фрейм данных
Вопрос:
У меня есть фрейм данных, который выглядит следующим образом
Player Pos Team Opp Def v Pos Salary StdDev Own My Proj Target_Score
0 Jared Goff CPTN LAR vs NE 7th 16500 9.0 0% 27.41 NaN
1 Cam Newton CPTN NE @ LAR 2nd 15900 8.9 0% 26.75 NaN
2 Robert Woods CPTN LAR vs NE 8th 13800 8.6 0% 22.68 NaN
3 Cooper Kupp CPTN LAR vs NE 8th 14400 9.2 0% 21.84 NaN
4 Jakobi Meyers CPTN NE @ LAR 2nd 10200 7.0 0% 21.59 NaN
5 Jared Goff QB LAR vs NE 7th 11000 9.0 0% 18.27 33.2
6 Cam Newton QB NE @ LAR 2nd 10600 8.9 0% 17.83 33.2
7 Cam Akers CPTN LAR vs NE 22nd 12000 4.8 0% 17.82 NaN
8 Damien Harris CPTN NE @ LAR 4th 13200 5.2 0% 16.16 NaN
9 Robert Woods WR LAR vs NE 8th 9200 8.6 0% 15.12 30.7
10 Cooper Kupp WR LAR vs NE 8th 9600 9.2 0% 14.56 30.7
11 Jakobi Meyers WR NE @ LAR 2nd 6800 7.0 0% 14.39 28.1
12 Damiere Byrd CPTN NE @ LAR 2nd 1200 6.6 0% 13.59 NaN
13 Matt Gay CPTN LAR vs NE 25th 5700 3.4 0% 13.35 NaN
14 James White CPTN NE @ LAR 4th 9600 7.5 0% 12.75 NaN
15 Gerald Everett CPTN LAR vs NE 9th 5100 5.2 0% 12.32 NaN
16 Cam Akers RB LAR vs NE 22nd 8000 4.8 0% 11.88 30.0
17 Tyler Higbee CPTN LAR vs NE 9th 7500 6.7 0% 11.60 NaN
18 Nick Folk CPTN NE @ LAR 5th 6000 3.7 0% 11.46 NaN
19 Rams CPTN LAR vs NE 27th 6600 6.8 0% 11.24 NaN
20 Josh Reynolds CPTN LAR vs NE 8th 8400 5.7 0% 11.21 NaN
21 N Keal Harry CPTN NE @ LAR 2nd 2700 4.3 0% 10.85 NaN
22 Damien Harris RB NE @ LAR 4th 8800 5.2 0% 10.77 30.0
23 Damiere Byrd WR NE @ LAR 2nd 800 6.6 0% 9.06 10.0
24 Matt Gay K LAR vs NE 25th 3800 3.4 0% 8.90 NaN
25 James White RB NE @ LAR 4th 6400 7.5 0% 8.50 29.0
26 Gerald Everett TE LAR vs NE 9th 3400 5.2 0% 8.21 24.0
27 Darrell Henderson CPTN LAR vs NE 22nd 11100 7.1 0% 7.92 NaN
28 Tyler Higbee TE LAR vs NE 9th 5000 6.7 0% 7.73 26.3
29 Nick Folk K NE @ LAR 5th 4000 3.7 0% 7.64 NaN
30 Patriots CPTN NE @ LAR 10th 6300 6.8 0% 7.59 NaN
31 Rams DST LAR vs NE 27th 4400 6.8 0% 7.49 15.3
32 Josh Reynolds WR LAR vs NE 8th 5600 5.7 0% 7.47 28.1
Мне нужно перебрать каждого игрока и сопоставить имена игроков, а затем обновить столбец Target_Score.
Пример:
Сопоставление Jared Goff CPTN и Jared Goff QB
for index, row in player_df.iterrows():
# if player name with position CPTN == player name with position QB
# player name with position CPTN Target_Score = player name with position
# QB['Target_Score'] * 1.5
По сути, мне нужно сопоставить каждого игрока с их соответствующей позицией CPTN и обновить целевой показатель CPTN до целевого показателя позиции * 1.5 итеративно.
Ответ №1:
Документированный встроенный
# Some test data
player_df = pd.DataFrame({ 'Player': ['Jared Goff', 'Cam Newton']*2,
'Pos': ['CPTN','CPTN', 'QB', 'WR'],
'Target_Score': [0,1,2,3]})
new_player_df = player_df.copy()
print (new_player_df)
print ("*"*10)
# Iterate overs players with CPTN
for index, row in player_df[player_df['Pos'] == 'CPTN'].iterrows():
# Get the match
match = player_df[(player_df['Player'] == row['Player']) amp;
(player_df['Pos'] != 'CPTN')]
# If there is a match
if len(match) > 0:
# Repace the score
new_player_df.loc[index, 'Target_Score'] = match.iloc[0]['Target_Score'] * 1.5
print (new_player_df)
Вывод:
Player Pos Target_Score
0 Jared Goff CPTN 0
1 Cam Newton CPTN 1
2 Jared Goff QB 2
3 Cam Newton WR 3
**********
Player Pos Target_Score
0 Jared Goff CPTN 3.0
1 Cam Newton CPTN 4.5
2 Jared Goff QB 2.0
3 Cam Newton WR 3.0
Комментарии:
1. Мне это нужно для каждой позиции, а не только для QB
2. Итак, я предполагаю, что для каждого плательщика, кроме CPTN, будет только больше позиций, потому что, если их несколько, то
'Target_Score
* 1.5 будет перезаписано, и в результате будет только последнее совпадение. Если это так, см. Мое редактирование.3. Да, для каждой позиции QB, RB, WR, TE, DST существует только один CPTN
4. @AustinJohnson затем, пожалуйста, проверьте отредактированный ответ.
Ответ №2:
Выберите оценки, которые являются вашей основной истиной, обработайте их, затем сопоставьте их обратно с позициями CPTN. Это предполагало, что игроки встречаются только один раз в позициях CPTN и не-CPTN.
cptn_selector = df["Pos"] == "CPTN"
other_selector = ~cptn_selector
players_and_scores = df.loc[other_selector, ["Player", "Target_Score"]]
players_and_scores["Target_Score_CPTN"] = players_and_scores["Target_Score"].values * 1.5
name_to_score_mapping = pd.Series(
players_and_scores["Target_Score"].values,
index=players_and_scores["Player"]
).to_dict()
df.loc[cptn_selector, "Target_Score"] = df.loc[cptn_selector, "Player"].map(name_to_score_mapping)
Комментарии:
1. При этом я просто возвращаю тот же результат. Это не умножает его на 1,5
2. Попробуйте с этой строкой
players_and_scores["Target_Score_CPTN"] = players_and_scores["Target_Score"].values * 1.5