Dataframe Nested Loop - set_value变量输入

时间:2016-10-03 13:56:39

标签: python pandas dataframe

希望有人能够指出我正确的方向,因为我不熟悉Python。

我正在做一个小项目,以便使用一些足球数据来掌握Python中的数据分析。我有两个数据帧,一个有玩家信息,另一个有匹配信息(match_df)。 match_df有22列,每个玩家都有一个玩家ID。我想将match_df中的player_ID数据换成玩家的技能等级。我写了一个函数来查找一个玩家和一个日期并返回评级(find_player_skill)。我想将它应用于数据帧中的每个相关列,但无法解决如何使用apply函数,因为参数依赖于dataframe行。因此,我认为最简单的方法是在数据帧的每个元素上使用set_value,如下所示。

问题是我没有设法让它执行(虽然我没有尝试连续运行数小时)。我假设有一种方法可以在合理的时间内使用不同的代码或加强版本来做同样的事情。我试过在一个小样本(3行)上运行代码,这个样本很快,然后1000行,但是在30分钟左右没有完成。

#change player ID's to skill data, currently runs very slowly
for i in range(len(match_df['match_date'])):
    match_date = match_df['match_date'].iloc[i]
    match_index = match_df.iloc[i].name
    for pl_lab in ['h1','h2','h3','h4','h5','h6','h7','h8','h9','h10', 'h11',\
                   'a1','a2','a3','a4','a5','a6','a7','a8','a9','a10','a11']:
        player_ID = match_df[pl_lab].iloc[i]
        player_skill = find_player_skill(player_ID, match_date)
        match_df.set_value(match_index,pl_lab,player_skill)

任何建议都非常感谢。

编辑:我也考虑过调试代码并为此下载了Pycharm,但是我写的一些早期代码似乎运行得很慢(我最初在iPython中编写了所有代码)

1 个答案:

答案 0 :(得分:1)

这是一个你可以做的操作,假设df是匹配的数据帧,其中第0列到第2列是玩家ID:

df = pd.DataFrame([['c' , 'a', 'b'], ['b', 'c', 'a']])
 df
Out[70]: 
   0  1  2
0  c  a  b
1  b  c  a

df_player = pd.DataFrame([['a', 100], ['b', 230], ['c', 200]],columns=['ID', 'skill']).set_index('ID')

    skill
ID       
a     100
b     230
c     200


dic = df_player.to_dict()['skill']

df.apply(lambda x: [dic[n] if n in dic.keys() else n for n in x], axis=1)
Out[69]: 
     0    1    2
0  200  100  230
1  230  200  100