Добавление столбцов на основе значений в той же группе - PullRequest
1 голос
/ 25 февраля 2020

У меня был вопрос, основанный на данных, отформатированных таким образом, который не является оптимальным для «анализа». Например, у нас есть одна запись на имя на игру, и у нас также есть данные о игроке, против которого они играли (всегда 2 записи за игру; думаю, центр против центра или pg против pg в баскетболе и т. Д. c).

Текущие данные:

    uid   name  field1  field2  field3
    1     bob       35      0       49
    1     evan       4      24      29
    2     bob       39      47      26
    2     mike       6      40      49
    3     bob       48      7       7
    3     evan      18      20      11
    4     bob        3      49      41
    4     evan      25      35      23

Желаемый результат:

uid     name    versus  field1  field2  field3
1        bob    evan    same as above 
1        evan   bob
2         bob   mike
2        mike   bob
3         bob   evan
3        evan   bob 
4         bob   evan    
4        evan   bob 

Цель этой перестановки / дополнения состоит в том, что теперь я могу выполнять групповой анализ для одного игрока против нескольких других игр, чтобы узнать, как они в среднем в этом матче.

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

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

df['versus'] = df.groupby('uid')['name'].transform(lambda x: x[::-1])
1 голос
/ 25 февраля 2020

Если вам нужно только имя другого игрока, вам нужно go для решения Рохита. Вы также можете использовать merge и query для получения статистики других игроков:

(df.merge(df, on='uid')
  .query('name_x != name_y')
)

Выход

      uid  name_x      field1_x    field2_x    field3_x  name_y      field1_y    field2_y    field3_y
--  -----  --------  ----------  ----------  ----------  --------  ----------  ----------  ----------
 1      1  bob               35           0          49  evan               4          24          29
 2      1  evan               4          24          29  bob               35           0          49
 5      2  bob               39          47          26  mike               6          40          49
 6      2  mike               6          40          49  bob               39          47          26
 9      3  bob               48           7           7  evan              18          20          11
10      3  evan              18          20          11  bob               48           7           7
13      4  bob                3          49          41  evan              25          35          23
14      4  evan              25          35          23  bob                3          49          41
...