2016-10-03 4 views
2

私がPythonを初めて使うとき、誰かが正しい方向に向けるようになるかもしれません。データフレーム入れ子ループ - set_value変数の入力

私は、いくつかのサッカーデータを使用してPythonでデータ解析を行うための小さなプロジェクトを行っています。私は2つのデータフレームを持っています.1つはプレイヤー情報で、もう1つはマッチ情報(match_df)です。 match_dfには、一致する各プレーヤーのプレーヤーIDを含む22個の列があります。 match_dfのplayer_IDデータをプレイヤーのスキル評価用に交換したいと思います。私はプレーヤーと日付を検索し、評価を返す関数を書いています(find_player_skill)。これをデータフレーム内の関連するすべての列に適用したいが、引数がデータフレーム行に依存するため、apply関数の使用方法を理解できない。したがって、以下のようにデータフレームの各要素に対してset_valueを使用するのが最も簡単な方法です。

問題は、これを実行することができなかったことです(私は何時間も実行していませんでしたが)。私は、別のコードまたはスープされたバージョンで同じことを妥当な時間に行う方法があると仮定します。私はコードを30分ほどで完了しなかった1000行と高速だった小さなサンプル(3行)で実行しようとしました。

#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) 

ご迷惑をおかけして申し訳ありません。

EDIT:それはまた、私はコードをデバッグについて考え、これが、私が書いた以前のコードの一部についてPycharmをダウンロードし、非常にゆっくりと実行するように見えたと言って価値がある、ここで

+0

:あなたがすることができる操作があり、DFを仮定すると、2列0試合のデータフレームは、プレイヤーIDです遊ぶあなたの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

(私は当初iPythonですべてを書きました)私はあなたのDFへのアクセスを持っていない私たちが持っているので、あなたは2迅速なコード行を投稿できるが

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 
関連する問題