Нужно выполнить Слияние в Панд Точно Так Же, Как VLOOKUP

#python-3.x #pandas

Вопрос:

У меня есть таблица фэнтезийных игроков и их индивидуальная статистика игр. Что я хотел бы добавить, так это столбец, в котором указана линия Вегаса этой отдельной игры.

Я объединяюсь с приведенной ниже электронной таблицей:

 Favorite Spread Underdog Spread2 Total Away Money Line Home Money Line Week Patriots -7.0 Steelers 7 51.0  270 -340 1 Packers -6.0 Bears 6 48.0 -286  230 1 Chiefs -1.0 Texans 1 40.0 -115 -105 1 Jets -4.0 Browns 4 40.0  170 -190 1 Colts -1.0 Bills 1 44.0 -115 -105 1 Dolphins -4.0 Football Team 4 46.0 -210  175 1 Panthers -3.0 Jaguars 3 41.0 -150  130 1 Seahawks -4.0 Rams 4 42.0 -185  160 1 Cardinals -2.0 Saints 2 49.0  120 -140 1 Chargers -4.0 Lions 4 46.0  160 -180 1 Buccaneers -3.0 Titans 3 40.0  130 -150 1 Bengals -3.0 Raiders 3 43.0 -154  130 1 Broncos -4.0 Ravens 4 46.0  180 -220 1 Cowboys -7.0 Giants 7 52.0  240 -300 1 Eagles -3.0 Falcons 3 55.0 -188  150 1 Vikings -2.0 49ers 2 42.0 -142  120 1   df = pd.read_excel('Fantasy2015.xlsx') odds = pd.read_excel('Odds2015Wk1.xlsx')   odds['Favorite'] = odds['Favorite'].map(lambda x: x.lstrip('at')) odds['Underdog'] = odds['Underdog'].map(lambda x: x.lstrip('at'))   df['Week'] = df['Week'].astype(int) odds['Week'] = 1 odds['Favorite'] = odds['Favorite'].astype(str)   odds['Week'].astype(str)  odds['Underdog'] = odds['Underdog'].astype(str)   odds['Week'].astype(str)   df['Merge'] = df['Tm']   df['Week'].astype(str)  df = df.merge(odds['Spread'], left_on='Merge', right_on=odds['Favorite'], how='left') df = df.merge(odds['Spread'], left_on='Merge', right_on=odds['Underdog'], how='left')  

Что я получаю:

введите описание изображения здесь

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

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

1. Можете ли вы предоставить входные данные и ожидаемые выходные данные таким образом, чтобы их можно было загружать вместо изображения?

2. предоставьте образец df и кадры данных odds

Ответ №1:

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

Один из способов, которым вы могли бы это сделать, — объединить избранное, объединить аутсайдеров (путем внутреннего объединения). Тогда просто, но 2 вместе:

 import pandas as pd  odds = pd.DataFrame([ ['Patriots', '-7.0 ' , 'Steelers' , '7' , '51.0' , ' 270' , '-340' , '1'], ['Packers', '-6.0' , 'Bears' , '6' , '48.0' , '-286' , ' 230', '1'], ['Chiefs', '-1.0' , 'Texans' ,'1' , '40.0' , '-115' , '-105' , '1'], ['Jets' , '-4.0' , 'Browns' , '4' , '40.0' , ' 170' , '-190', '1'], ['Colts', '-1.0' , 'Bills' , '1' , '44.0' , '-115' , '-105', '1'], ['Dolphins', '-4.0' , 'Football Team' , '4' , '46.0' , '-210', ' 175' , '1'], ['Panthers', '-3.0' , 'Jaguars', '3' , '41.0' , '-150' , ' 130' , '1'], ['Seahawks' , '-4.0' , 'Rams' , '4' , '42.0' , '-185' , ' 160' , '1'], ['Cardinals', '-2.0' , 'Saints' ,'2' , '49.0' , ' 120' , '-140' , '1'], ['Chargers' , '-4.0' , 'Lions' , '4' , '46.0' , ' 160' , '-180' , '1'], ['Buccaneers', '-3.0' , 'Titans' , '3' , '40.0' , ' 130' , '-150' , '1'], ['Bengals' ,'-3.0' , 'Raiders', '3', '43.0' , '-154' , ' 130' , '1'], ['Broncos', '-4.0' , 'Ravens' , '4' , '46.0' , ' 180' , '-220' , '1'], ['Cowboys', '-7.0' , 'Giants' , '7' , '52.0' , ' 240' , '-300' , '1'], ['Eagles', '-3.0' , 'Falcons', '3' , '55.0' , '-188' , ' 150' , '1'], ['Vikings', '-2.0' , '49ers' , '2' ,'42.0' , '-142' , ' 120' , '1']], columns = ['Favorite', 'Spread', 'Underdog' , 'Spread2', 'Total' , 'Away Money Line', 'Home Money Line', 'Week'])   df = pd.DataFrame([  ['Devonte Freemon', 'RB', '2015-09-14 00:00:00', '1', 'Falcons'],  ['Antonion Brownn', 'WR', '2015-09-10 00:00:00', '1', 'Steelers'],  ['Adrian Peterson', 'RB', '2015-09-14 00:00:00', '1', 'Vikings'],  ['Cam Newton', 'QB', '2015-09-14 00:00:00', '1', 'Panthers']],  columns = ['Name','Position','Date','Week','Tm'])    df['Week'] = df['Week'].astype(int) odds['Week'] = odds['Week'].astype(int) odds['Spread'] = odds['Spread'].astype(float)   favorite_merged = df.merge(odds.rename(columns={'Favorite':'Tm'})[['Tm','Week','Spread']], how='inner', on=['Tm','Week']) underdog_merged = df.merge(odds.rename(columns={'Underdog':'Tm'})[['Tm','Week','Spread']], how='inner', on=['Tm','Week'])  # Because the spread for the Underdog should be positive underdog_merged['Spread'] = underdog_merged['Spread'] * -1  final_df = pd.concat([favorite_merged, underdog_merged]).reset_index(drop=True)  

Выход:

 print(df)  Name Position Date Week Tm 0 Devonte Freemon RB 2015-09-14 00:00:00 1 Falcons 1 Antonion Brownn WR 2015-09-10 00:00:00 1 Steelers 2 Adrian Peterson RB 2015-09-14 00:00:00 1 Vikings 3 Cam Newton QB 2015-09-14 00:00:00 1 Panthers  

это сейчас…

 print(final_df)  Name Position Date Week Tm Spread 0 Adrian Peterson RB 2015-09-14 00:00:00 1 Vikings -2.0 1 Cam Newton QB 2015-09-14 00:00:00 1 Panthers -3.0 2 Devonte Freemon RB 2015-09-14 00:00:00 1 Falcons 3.0 3 Antonion Brownn WR 2015-09-10 00:00:00 1 Steelers 7.0  

Ответ №2:

Попробуйте изменить x.lstrip('at') на x.lstrip('at ')

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

1. к сожалению, это не сработало.