Pandas DataFrame - Добавить столбец, содержащий условную сумму «предыдущих» строк - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть данные о результатах теннисного матча:

tennis_cols = ['Year','TourNo','MatchNo','Round','Winner','Loser']
tennis_rslts = [ [2018, 1, 1, 'QF', 'PlayerA', 'PlayerB']
                ,[2018, 1, 2, 'QF', 'PlayerC', 'PlayerD']
                ,[2018, 1, 3, 'QF', 'PlayerE', 'PlayerF']
                ,[2018, 1, 4, 'QF', 'PlayerG', 'PlayerH']
                ,[2018, 1, 5, 'SF', 'PlayerA', 'PlayerC']
                ,[2018, 1, 6, 'SF', 'PlayerE', 'PlayerG']
                ,[2018, 1, 7, 'F',  'PlayerA', 'PlayerE'] ]
dfTennis=pd.DataFrame(tennis_rslts,columns=tennis_cols)
dfTennis

    Year    TourNo  MatchNo Round   Winner     Loser    
0   2018    1       1       QF      PlayerA    PlayerB
1   2018    1       2       QF      PlayerC    PlayerD
2   2018    1       3       QF      PlayerE    PlayerF
3   2018    1       4       QF      PlayerG    PlayerH
4   2018    1       5       SF      PlayerA    PlayerC
5   2018    1       6       SF      PlayerE    PlayerG
6   2018    1       7       F       PlayerA    PlayerE

Я хочу добавить столбец WinsToDate, в котором будет указано количество побед победителя в этом матче до текущего матча, т. Е .:

    Year    TourNo  MatchNo Round   Winner     Loser    WinsToDate  
0   2018    1       1       QF      PlayerA    PlayerB  0
1   2018    1       2       QF      PlayerC    PlayerD  0 
2   2018    1       3       QF      PlayerE    PlayerF  0
3   2018    1       4       QF      PlayerG    PlayerH  0
4   2018    1       5       SF      PlayerA    PlayerC  1  <-- PlayerA won MatchNo 1
5   2018    1       6       SF      PlayerE    PlayerG  1  <-- PlayerE won MatchNo 3
6   2018    1       7       F       PlayerA    PlayerE  2  <-- PlayerA won MatchNo 1 and 5

Мой реальный набор данных достаточно большой, чтобы итерация по набору данных была слишком медленной. Есть идеи, как мне эффективно добиться результата?

По сути, я хочу посчитать количество строк, в которых Победитель соответствует обрабатываемой строке, а номер совпадения меньше текущей обрабатываемой строки.

** ОБНОВЛЕНИЕ ** Я могу подсчитать, сколько раз победитель встречается в кадре данных, используя:

dfTennis['Count'] = list(map(lambda x : len(dfTennis[(dfTennis['Winner'] == x)]), dfTennis['Winner']))

Но здесь учитываются все вхождения, а не все вхождения до текущей строки.

1 Ответ

0 голосов
/ 30 апреля 2018

Странно, я собираюсь ответить на свой вопрос.

Код, необходимый для вычисления столбца WinsToDate:

dfTennis['WinsToDate'] = list(map(lambda x : len(dfTennis[(dfTennis['Winner'] == dfTennis.iloc[x]['Winner']) & 
                                                          (dfTennis['MatchNo'] < dfTennis.iloc[x]['MatchNo'])]), dfTennis.index.values))

Передача значения индекса лямбда-функции означала, что я мог получить доступ к данным в полях Winner и MatchNo, чтобы применить требуемую логику.

Приглашаем услышать какие-нибудь лучшие решения, но, похоже, это работает для моих нужд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...