#python #pandas
#питон #панды
Вопрос:
Ниже приведен пример базы данных панд:
player games result 855 Zoom 156 0 856 Zoom 213 1 857 Zothve 7 0 858 Zothve 2 1 859 zs 55 0 860 zs 20 1 861 Zvene 34 0 862 Zvene 25 1 863 Zz1tai 54 0 864 Zz1tai 60 1
У меня есть еще один фрейм данных с игроками и их коэффициентами выигрышей
player winPercentage 0 Zoom 71.6049 1 zs 71.4286 2 Zvene 71.2025 3 zz1tai 70.3704 4 DREAMPYLLA 69.8113 5 Khan 69.2857 6 Looper 68.4932 7 Buggax 67.2269 8 Mouse 67.1053 9 Apii 66.6667
Как вы можете видеть, у каждого игрока есть 2 столбца, связанные с его именем в зависимости от результата, где 1-выигрыш, а 0-проигрыш. Я пытаюсь взять процент выигрыша для игрока из таблицы B и поместить его в новый столбец таблицы A. Я попробовал пару перестановок, включая то, что приведено ниже, и я не нашел решения, которое работает.
for name in a['player']: wp = b['winPercentage'].loc[b['player']==name].to_string(index=False) try: if zip(a['player'], a['result']) == (name, 1): a['WinPercentage'] = float(wp) else: a['WinPercentage'] = 1-float(wp) except Exception as e: print(e)
Я знаю, что если бы все это было числовым, я мог бы использовать numpy, и я знаю, что я не должен повторять строки панд. Я знаю, что лямбда-функция-это опция, но я не смог заставить ее работать. Я ищу совета не только о том, как это сделать, но и о самом простом способе сделать это.
Ответ №1:
Вы просто пытаетесь соединить два кадра данных на основе столбца игрока. Так :
df = df0.merge(df1, on="player")
Где df0
и df1
являются первым и вторым кадрами данных, которые вы описали, соответственно.
Комментарии:
1. Я предполагаю, что я не могу просто сделать df = df0.merge(df1[‘winPercentage’], on=»игрок»), чтобы просто переместить 1 столбец.
2. Вы можете легко удалить ненужные столбцы из конечного кадра данных с помощью df[[«player», «other_col», «yet_another_col»]]. При этом будет выбран только тот список столбцов, который вы хотите сохранить.
3. Можно ли просто использовать что-то вроде df0 = pd.merge(df0, df1[[‘winPercentage’]]], on= «игрок», как=»слева» )? Единственная проблема, с которой я здесь сталкиваюсь, заключается в том, что я думаю, что один из игроков в df0 не входит в df1, и поэтому он создает исключение.
4. Нет, потому что тогда вы слились бы с фреймом данных, в котором даже нет столбца игрока, необходимого для слияния.
5. Я проверяю этот комментарий, так как это было лучшее решение с имеющимися у вас данными. Я понимаю, что упустил кое-какую информацию. Мое окончательное решение состояло в том, чтобы создать 2 кадра данных из основных, объединить их, как вы показали, а затем применить лямбда-функцию к одному из них. Я опубликую решение во втором комментарии. Спасибо за вашу помощь.
Ответ №2:
Объедините два кадра данных, затем найдите, где результат = 0, и измените на np.nan.
df = df1.merge(df2, on="player", how='left') df['winPercentage'] = np.where(df['result']==0, np.nan, df['winPercentage']) player games result winPercentage 0 Zoom 156 0 NaN 1 Zoom 213 1 71.605 2 Zothve 7 0 NaN 3 Zothve 2 1 NaN 4 zs 55 0 NaN 5 zs 20 1 71.429 6 Zvene 34 0 NaN 7 Zvene 25 1 71.203 8 Zz1tai 54 0 NaN 9 Zz1tai 60 1 NaN
Комментарии:
1. Если в A и B есть куча других столбцов. Есть ли способ либо объединить только столбец winPercentage в A?
2. df1[[«игрок», «игры», «результат»]].объединить(df2[[«игрок», «winPercentage»]], on=»игрок», как=»слева») — будут объединены только столбцы в скобках; все остальные будут проигнорированы. как отмечено в комментариях ниже, вам нужно, чтобы «игрок» был указан в обоих кадрах данных