iterrows()需要花费几个小时才能运行,如何提高速度?

时间:2018-10-21 19:13:32

标签: python python-3.x pandas multiprocessing

下面是示例数据- 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是“比赛信息”字段中的正确玩家
left_plater_test是“比赛信息”字段中的左侧玩家
“数据”数据帧中有更多统计信息,这些数据适用于“玩家”字段中的任何人

目标是确定“播放器”位于“ Matchup_info”的左侧还是右侧,并将结果分配给“ side”列,以便我可以从“ Score”字段中获取正确的值。分数“-”左侧的数字属于左手玩家,反之亦然。

例如,在第一条记录中,Tihomir Grozdanov的总得分为12(6 + 6),而Vatutin的总得分为5(4 + 1)

问题是我正在执行大约250K +行(可能还会有更多行),并且要花几个小时才能完成。有没有更快的方法可以做到这一点?

在这里我无法考虑如何使用apply(),因为我需要使用3列来计算side字段。我现在唯一能想到的其他解决方案是尝试使用多处理程序包,但我想在跳转到此之前先看看是否有其他熊猫替代品。

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以将numpyselect一起使用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'])