Итерация через Pandas DataFrame с несколькими дескрипторами и итеративное добавление отредактированных строк? - PullRequest
0 голосов
/ 07 июня 2019

У меня есть 3 кадра данных:

  • df1 с историей матчей (упорядочено по дате)
  • df2 со статистикой игрока (упорядочено по имени игрока)
  • df3 разница между показателями игрока (df2) за матч (df1) [в процессе]

Я хочу сделать что-то вроде:

    for idx, W_nm, L_nm in df1[['index','winner_name','loser_name']].values:
      df3.loc[idx] = df2.loc[W_nm] - df2.loc[L_nm]
      #... edit this row further

Что не получается, потому что:

  • 'idx' не ссылается на индексы df1
  • df3 не имеет определенных столбцов

Есть лиспособ ссылаться на индексы в первой строке?

Я прочитал iterrows() в 7 раз медленнее, чем .loc[], и у меня достаточно данных для обработки

Есть что-нибудьчище, чем это:

    for idx in df1.index:
      W_nm = df1.loc[idx,'winner_name']
      L_nm = df1.loc[idx,'loser_name']
      df3.loc[idx] = df2.loc[W_nm] - df2.loc[L_nm]
      #... edit this row further

Который не исправляет "не определенные столбцы", но дает мне мои ручки.

Так что я ожидаю что-то вроде:

 df1
[            'Loser'  'Winner'   'Score'
  0          Harry    Hermione   3-7   ...
  1          Harry    Ron        0-2   ...
  2          Ron      Voldemort  7-89   ... ]

 df2
[            'Spells' 'Allies'
  Harry      23       84      ...
  Hermione   94       68      ...
  Ron        14       63      ...
  Voldemort  97       92      ... ]

then

df3
[            'Spells' 'Allies'
  0          -71      16      ...
  1          9        21      ...
  2          -83      -29     ... ]

1 Ответ

0 голосов
/ 07 июня 2019

Что вам нужно, это join:

loser = df1.join(df2, on='Loser').loc[:,['Spells', 'Allies']]
winner = df1.join(df2, on='Winner').loc[:,['Spells', 'Allies']]
df3 = winner - loser

В вашем примере данные дают:

   Spells  Allies
0      71     -16
1      -9     -21
2      83      29
...