2016-10-03 286 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