Расчет столбцов Панд Python

#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=»игрок», как=»слева») — будут объединены только столбцы в скобках; все остальные будут проигнорированы. как отмечено в комментариях ниже, вам нужно, чтобы «игрок» был указан в обоих кадрах данных