我有一个数据集,其中包含游戏中的回合,姓名和分数:
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?
我开始尝试枚举,但不断弄乱语法
答案 0 :(得分:2)
这是我的方法:
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 :(得分:1)
在我看来,这绝对是最好的方法
由于每场比赛只有两个团队参加比赛,因此您可以使用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
答案 2 :(得分:0)
您可以使用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
如果您不希望使用MultiIndex:
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