Перечислять строки по группам в Python - PullRequest
1 голос
/ 19 сентября 2019

У меня есть набор данных с раундами в игре, именами и счетами:

import pandas as pd 

data = [[1,'tom', 10], [1,'nick', 15], [2,'juli', 14], [2,'peter', 20], [3,'juli', 3], [3,'peter', 13]] 

have = pd.DataFrame(data, columns = ['Round', 'Name', 'Score']) 

have.sort_values(by=['Round','Score'])

Как мне получить набор данных с раундами, WinnerName, LooserName, WinnerScore и LooserScore?

Я начал пытаться перечислить, но продолжаю портить синтаксис

Ответы [ 3 ]

2 голосов
/ 19 сентября 2019

Это мой подход:

min_max = have.groupby('Round').Score.agg(['idxmax','idxmin']).stack()
ret = pd.DataFrame(have.loc[min_max,["Name", "Score"]].values,
             index=min_max.index,
             columns=['Name','Score']).unstack()

# rename
ret.rename(mapper={"idxmax":'winner', 'idxmin':'looser'}, level=1, axis=1)

Вывод:

        Name         Score       
      winner looser winner looser
Round                            
1       nick    tom     15     10
2      peter   juli     20     14
3      peter   juli     13      3
1 голос
/ 19 сентября 2019

это, безусловно, мне кажется лучшим подходом

, поскольку в каждом матче соревнуются только две команды, вы можете заказать, используя pandas.DataFrame.sort_values ​​ и использовать

Groupby.Series.first и Groupby.Series.last :

result=have.sort_values('Score',ascending=False).groupby('Round').agg({'Name':{'Winner':'first','Looser':'last'},'Score':{'WinnerScore':'first','LooserScore':'last'}})
print(result)

        Name              Score            
      Winner Looser WinnerScore LooserScore
Round                                      
1       nick    tom          15          10
2      peter   juli          20          14
3      peter   juli          13           3
0 голосов
/ 19 сентября 2019

Вы можете использовать sort + cumcount для обозначения результатов на основе оценки, тогда это будет pivot.

data = [[1,'tom', 10], [1,'nick', 15], [2,'juli', 14], 
        [2,'peter', 20], [3,'juli', 3], [3,'peter', 13]] 
have = pd.DataFrame(data, columns = ['Round', 'Name', 'Score']) 

have = have.sort_values('Score')
have['outcome'] = have.groupby('Round').cumcount().map({0: 'Loser', 1: 'Winner'})

res = have.pivot(index='Round', columns='outcome', values=['Score', 'Name'])

         Name        Score       
outcome Loser Winner Loser Winner
Round                            
1         tom   nick    10     15
2        juli  peter    14     20
3        juli  peter     3     13

Если вы нене нужен мультииндекс:

res.columns = [''.join(x[::-1]) for x in res.columns]
res = res.reset_index()

   Round LoserScore WinnerScore LoserName WinnerName
0      1         10          15       tom       nick
1      2         14          20      juli      peter
2      3          3          13      juli      peter
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...