我有这个数据框
frame = pd.DataFrame({'player1' : ['Joe', 'Steve', 'Bill', 'Doug', 'Steve','Bill','Joe','Steve'],
'player2' : ['Bill', 'Doug', 'Steve', 'Joe', 'Bill', 'Steve', 'Doug', 'Bill'],
'winner' : ['Joe','Steve' , 'Steve','Doug', 'Bill', 'Steve', 'Doug', 'Steve'],
'loser' : ['Bill', 'Doug', 'Bill', 'Joe', 'Steve', 'Bill', 'Joe', 'Bill'],
'ones' : 1})
我可以通过这样做来保持胜利者获胜多少次。
frame['winners_wins'] = frame.groupby('winner')['ones'].cumsum()
我想保持球员1的输赢数和球员2的相同数量。 我想我应该可以使用groupby函数执行此操作,但我不知道如何编写它。
编辑:
我第一次没说好。我想跟踪每个玩家。所以期望的输出是:
player1 player2 winner loser player1_wins player2_wins
Joe Bill Joe Bill 1 0
Steve Doug Steve Doug 1 0
Bill Steve Steve Bill 0 2
Doug Joe Doug Joe 1 1
Steve Bill Bill Steve 2 1
Bill Steve Steve Bill 1 3
Joe Doug Doug Joe 1 2
Steve Bill Steve Bill 3 1
答案 0 :(得分:1)
您希望获得player1's
和player2's
的总胜出次数。这是一个非常平凡的方式,它使用Python而不是Pandas。
需要逐步遍历行并使用先前结果计算下一行的计算往往不利于Pandas / Numpy操作 - cumsum
是一个例外。
所以我不认为使用Pandas操作有一种灵巧的方法,但我可能是错的。
import pandas as pd
import collections
df = pd.DataFrame({'player1' : ['Joe', 'Steve', 'Bill', 'Doug',
'Steve','Bill','Joe','Steve'], 'player2' : ['Bill',
'Doug', 'Steve', 'Joe', 'Bill', 'Steve', 'Doug', 'Bill'],
'winner' : ['Joe','Steve' , 'Steve','Doug', 'Bill',
'Steve', 'Doug', 'Steve'], 'loser' : ['Bill', 'Doug',
'Bill', 'Joe', 'Steve', 'Bill', 'Joe', 'Bill'], },
columns = ['player1', 'player2', 'winner', 'loser'])
wins = collections.Counter()
def count_wins():
for idx, row in df.iterrows():
wins[row['winner']] += 1
yield wins[row['player1']], wins[row['player2']]
df['player1_wins'], df['player2_wins'] = zip(*list(count_wins()))
print(df)
打印
player1 player2 winner loser player1_wins player2_wins
0 Joe Bill Joe Bill 1 0
1 Steve Doug Steve Doug 1 0
2 Bill Steve Steve Bill 0 2
3 Doug Joe Doug Joe 1 1
4 Steve Bill Bill Steve 2 1
5 Bill Steve Steve Bill 1 3
6 Joe Doug Doug Joe 1 2
7 Steve Bill Steve Bill 4 1
答案 1 :(得分:1)
不需要那些“那些”专栏,或者实际上,不需要分组。
In [19]: del frame['ones']
In [20]: frame['player1_wins'] = (frame['winner'] == frame['player1']).astype('int').cumsum()
In [21]: frame['player2_wins'] = (frame['winner'] == frame['player2']).astype('int').cumsum()
In [22]: frame
Out[22]:
loser player1 player2 winner player1_wins player2_wins
0 Bill Joe Bill Joe 1 0
1 Doug Steve Doug Steve 2 0
2 Bill Bill Steve Steve 2 1
3 Joe Doug Joe Doug 3 1
4 Steve Steve Bill Bill 3 2
5 Bill Bill Steve Steve 3 3
6 Joe Joe Doug Doug 3 4
7 Bill Steve Bill Steve 4 4
获取winners_wins
而不诉诸“一些”列的一种方法是:
In [26]: frame['winners_wins'] = frame.groupby('winner').winner.transform(lambda x: np.arange(1, 1 + len(x))