2013-08-20 3 views
1

У меня есть этот фрейм данныхпанды GroupBy значения другого столбца

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() 

Я хотел бы сохранить текущий счет побед и потерь player1 в то же самое и для player2. Я думаю, что я должен быть в состоянии сделать это с помощью функции 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 

ответ

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

Нет необходимости для этого столбца "единиц" или, на самом деле, для группировки.

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)) 
Смежные вопросы