2015-10-06 7 views
1

У меня есть следующие панды dataframe, содержащей информацию спортивного матча:Панда Dataframe добавить колонку на основе подсчета других столбцов

tournament playerA playerB 
1    A   B 
1    C   B 
1    D   A 
2    A   B 
2    A   C 
2    A   D 

теперь я хочу, чтобы добавить новый столбец (или создать новый dataframe, все, что легче выполнить), содержащую информацию о том, сколько принимавших участие игроков за турнира. Участник команды является набор (без дубликатов) от playerA и playerB колонок.

Если новый столбец добавляется новый dataframe должен выглядеть следующим образом (турнир 1 имеет 4 игроков, участвующих, т.е. А, В, С и D; турнира два имеет 3 игроков, участвующих, например, A , B, и C):

tournament playerA playerB players_sum 
1    A   B   4 
1    C   B   4 
1    D   A   4 
2    A   B   3 
2    A   C   3 

Если это проще создать новый dataframe он может/должен выглядеть следующим образом:

tournament players_sum 
1    4 
2    3 

то, что я пытался до сих пор: я не попробовал groupby(), а затем apply() или transform() однако я не знаю, как объединить информацию из двух столбцов (playerA и playerB).

Спасибо, ваша помощь очень ценится.

ответ

1

Я бы сделал это, создав словарь для турниров unique(), а затем сопоставив их с новым столбцом.

tourneys = df['tournament'].unique() 
player_dict = {} 
for event in tourneys: 
    ndf = df[df['tournament'] == event].copy() 
    player_dict[event] = len(ndf['playerA'].append(ndf['playerB']).unique()) 

df['player_sum'] = df['tournament'].map(player_dict) 

ДФ

playerA playerB tournament player_sum 
0  A  B   1   4 
1  C  B   1   4 
2  D  A   1   4 
3  A  B   2   3 
4  A  C   2   3 
1

Так, параллельно, я нашел решение, я хочу, чтобы разместить его здесь:

def myfunc(group): 
    w_set = set(group['playerA']) 
    l_set = set(group['playerB']) 
    group['player_sum'] = len(w_set.union(l_set)) 
    return group 

df = df.reset_index().groupby('tournament').apply(myfunc) 
Смежные вопросы