【问题标题】:How can I optimise this Python code?如何优化此 Python 代码?
【发布时间】:2017-01-16 14:10:41
【问题描述】:

我想得到每个国家所有IndicatorsCode 的Year 值的平均值:

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'])

这是结果的DataFrame:

如果您需要访问 csv:Suramerica.csv

此代码需要很长时间才能执行。感谢您的宝贵时间 - 任何建议都会很棒。

【问题讨论】:

    标签: python csv


    【解决方案1】:

    似乎没有必要遍历每个组合的完整数据。 我正在使用 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)
    

    【讨论】:

    • 谢谢!它完美!,还有一个问题,我需要在数组中添加所有国家/地区,因此如果国家/地区与任何 IndicatorCode 不匹配,我需要向其媒体添加 0.0。我怎么能用你的代码做到这一点?谢谢!!!
    • 谢谢!上帝保佑你!!
    【解决方案2】:

    我会以这种方式开始编写循环:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-24
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 2020-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多