iterrows () занимает несколько часов, как я могу ускорить его? - PullRequest
0 голосов
/ 21 октября 2018

Ниже приведены примеры данных - Sample Data

Текущее решение -

for idx, row in data.iterrows():

    rp = row['right_player_test']
    lp = row['left_player_test']
    p = row['Player']

    if rp in p:
        data.loc[idx, 'side'] = 'right'

    elif lp in p:
        data.loc[idx, 'side'] = 'left'

    else:
        print('bad -', lp, rp, p)

right_player_test - правый игрок в поле 'Matchup_info'
left_plater_testявляется левым игроком в поле 'Matchup_info'
В DataFrame 'data' больше статистических данных, и они предназначены для тех, кто находится в поле 'Player'

Цель состоит в том, чтобы определить, является ли 'Player''находится слева или справа от' Matchup_info 'и присвойте результат столбцам' side ', чтобы я мог получить правильные значения из поля' Score '.Число слева от знака «-» принадлежит левому игроку, и наоборот.

Например, в первой записи Tihomir Grozdanov будет иметь общий балл 12 (6 + 6), а Vatutin в итоге составит 5 (4 + 1)

Проблема в том, что я делаю это для примерно 250K + строк (возможно, даже больше), и это занимает часы, чтобы закончить.Есть ли более быстрый способ сделать это?

Я не могу придумать, как использовать apply() здесь, потому что мне нужно использовать 3 столбца для вычисления поля side.Единственное другое решение, о котором я могу подумать сейчас, это попытка использовать пакет многопроцессорности, но я хотел посмотреть, есть ли другие альтернативы панд, прежде чем перейти к этому.

Спасибо!

1 Ответ

0 голосов
/ 21 октября 2018

Вы можете использовать numpy select, с zip

s1=np.array([x in y for x , y in zip(df['right_player_test'],df['Player'])])
s2=np.array([x in y for x , y in zip(df['left_player_test'],df['Player'])])    
np.select([s1,s2,np.logical_and(~s1,~s2)],['right','left','bad'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...