2017-01-16 11 views
-3

私はすべての国のすべてのIndicatorsCodeYear値の平均取得したい:こここのPythonコードを最適化するにはどうすればよいですか?

import numpy as np 
import pandas as pd 
datos = pd.read_csv("suramerica.csv") 

media = list() 
agricultura = list() 
flag=0 

paises = np.array(['Antigua and Barbuda','Argentina','Chile','Colombia']) 
indicadores_agricultura = np.array(['EG.ELC.ACCS.RU.ZS','EG.NSF.ACCS.RU.ZS']) 

for i in paises: 
    for j in indicadores_agricultura: 
     for k in range(len(datos)): 
      if i==datos['CountryName'][k] and j==datos['IndicatorCode'][k]: 
       flag=1 
       media.append(datos['Year'][k]) 
    if flag==1: 
     agricultura.append(np.array([i,np.mean(media)])) 
     del media[:] 
     flag=0 
pd.DataFrame(agricultura,columns=['Paises','Agricultura y Desarrollo Rural']) 

は、結果のデータフレームです:

OutputData

あなたはCSVファイルにアクセスする必要がある場合:Suramerica.csv

このコードは実行に時間がかかります。あなたの時間をありがとう - アドバイスは素晴らしいでしょう。

答えて

0

すべての組み合わせのための完全なデータを通過する必要があるようですません。 私はdictオブジェクトを使用して必要な情報を保存しています。それを使ってnp.meanを計算する。これにより、実行速度が大幅に向上します。コード:

import numpy as np 
import pandas as pd 
datos = pd.read_csv("suramerica.csv") 

agricultura = list() 

output = {} 


paises = np.array(['Antigua and Barbuda','Argentina','Chile','Colombia']) 
indicadores_agricultura = np.array(['EG.ELC.ACCS.RU.ZS','EG.NSF.ACCS.RU.ZS']) 


for k in range(len(datos)): 
    cn = datos['CountryName'][k] 
    indicator_code = datos['IndicatorCode'][k] 
    # change1 
    if cn not in output.keys(): 
      output[cn] = [] 
    if cn in paises and indicator_code in indicadores_agricultura: 
     year = datos['Year'][k] 

for o in output: 
    # change2 
    media = output.get(o) 
    if not media: 
     media = 0.0 
    agricultura.append(np.array([o,np.mean(media)])) 

output2 = pd.DataFrame(agricultura,columns=['Paises','Agricultura y Desarrollo Rural']) 
print(output2) 
+0

ありがとうございます!それは完璧に動作します!、もう一つの質問、私はすべての国を配列に追加する必要がありますので、国がIndicatorCodeと一致しない場合は、メディアに0.0を追加する必要があります。あなたのコードでどうすればいいですか?ありがとう!!! – Ambigus9

+0

は上記のコードを更新しました。 –

+0

ありがとう!神のお恵みがありますように!! – Ambigus9

0

私はループをこのように書き始めるでしょう:

for k, _ in enumerate(datos): 
    cn = datos['CountryName'][k] 
    ic = datos['IndicatorCode'][k] 

    for i in paises: 
     if i != cn: 
      continue 
     for j in indicadores_agricultura: 
      if j == ic: 
       flag = 1 
       media.append(datos['Year'][k]) 

    if flag: 
     agricultura.append(np.array([i,np.mean(media)])) 
     del media[:] 
     flag = 0 
関連する問題