pandas groupby在不同列中的值

时间:2013-08-20 19:26:48

标签: python python-2.7 pandas

我有这个数据框

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

2 个答案:

答案 0 :(得分:1)

您希望获得player1'splayer2'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))