2016-10-03 288 views
2

希望有人能够指出我正确的方向,因为我是Python新手。Dataframe嵌套循环 - set_value变量输入

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

问题是,我还没有设法得到这个执行(虽然我还没有尝试过几个小时的运行)。我认为有一种方法可以在合理的时间内用不同的代码或加强版本来做同样的事情。我试着在一个很小的样本(3行)上快速运行代码,然后在30分钟左右没有完成的1000行代码。

#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中写道一切最初)

+0

我没有访问您的DF,您可以张贴2快行代码,所以我们有你的df玩的一个例子。但看看你的问题,我认为这可以用'match_df.replace(df_player ['theskillcolumns']。to_dict(),axis = 1)''来体现,其中df_player是你的df,其技能为列和玩家ID作为索引 –

+0

试试这对于player_df'pd.DataFrame({'date_stat':['2015-10-16','2015-09-21','20115-09-21'],'overall_rat ing' :[71.0,71.0,67.0]},index = [38255,3825 5,38256])'我忘了在我的原始文章中提到的额外复杂性是每个玩家可能拥有多个技能等级,需要使用匹配日期进行评估 – soundofsilence

回答

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