2017-01-16 109 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

似乎没有必要遍历完整的数据,每一个组合。 我正在使用一个字典对象来保存所需的信息。然后使用它来计算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