如何在python中迭代非常大的数据框?

时间:2019-11-12 20:13:24

标签: python pandas dataframe iteration row

我有一个代码,我的数据框包含将近80万行,因此不可能使用标准方法对其进行迭代。我搜索了一下,看到了iterrows()的方法,但我不知道如何使用。基本上这是我的代码,您能帮我如何为iterrows()更新它吗?

**

for i in range(len(x["Value"])):
    if x.loc[i ,"PP_Name"] in ['ARK','DGD','KND','SRG','HCO','MNG','KSK','KOP','KVB','Yamanli','ÇBS','Dogancay'] :
        x.loc[i,"Santral_Type"] = "HES"
    elif x.loc[i ,"PP_Name"] in ['BND','BND2','TFB','TFB3','TFB4','KNT']:
        x.loc[i,"Santral_Type"] = "TERMIK"
    elif x.loc[i ,"PP_Name"] in ['BRS','ÇKL','DPZ']:
        x.loc[i,"Santral_Type"] = "RES"
    else :  x.loc[i,"Santral_Type"] = "SOLAR"

**

5 个答案:

答案 0 :(得分:2)

如何遍历非常大的数据框 –通常,您不要。您应该对列整体使用某种矢量化操作。例如,您的情况可以是mapfillna

map_dict = {
    'HES' : ['ARK','DGD','KND','SRG','HCO','MNG','KSK','KOP','KVB','Yamanli','ÇBS','Dogancay'],
    'TERMIK' : ['BND','BND2','TFB','TFB3','TFB4','KNT'],
    'RES' : ['BRS','ÇKL','DPZ']
}

inv_map_dict = {x:k for k,v in map_dict.items() for x in v}

df['Santral_Type'] = df['PP_Name'].map(inv_map_dict).fillna('SOLAR')

答案 1 :(得分:1)

不建议您通过DataFrame进行这些操作。这是一种可行的方法,可以立即应用于DataFrame x的所有行:

# Default value
x["Santral_Type"] = "SOLAR"

x.loc[x.PP_Name.isin(['BRS','ÇKL','DPZ']), 'Santral_Type'] = "RES"
x.loc[x.PP_Name.isin(['BND','BND2','TFB','TFB3','TFB4','KNT']), 'Santral_Type'] = "TERMIK"
hes_list = ['ARK','DGD','KND','SRG','HCO','MNG','KSK','KOP','KVB','Yamanli','ÇBS','Dogancay']
x.loc[x.PP_Name.isin(hes_list), 'Santral_Type'] = "HES"

请注意,使用标准熊猫方法时,800k不能视为大表。

答案 2 :(得分:0)

根据{{​​3}}的

df.iterrows()返回tuple (index, Series)
您可以像这样使用它:

for row in df.iterrows():
    if row[1]['PP_Name'] in ['ARK','DGD','KND','SRG','HCO','MNG','KSK','KOP','KVB','Yamanli','ÇBS','Dogancay']:
        df['Santral_Type] = "HES"
        # and so on

顺便说一句,我必须说,使用iterrows会非常慢,并且看一下示例代码,很明显,您可以使用简单的熊猫选择技术来做到这一点而无需显式循环。
最好按照@mcsoini的建议进行操作

答案 3 :(得分:0)

当您有利用pandas api的矢量化解决方案时,我强烈建议您不要使用迭代和for循环。

这是您使用numpy修改的代码,其运行速度应比当前方法快得多。

import numpy as np
col = 'PP_Name'

conditions = [
        x[col].isin(
['ARK','DGD','KND','SRG','HCO','MNG','KSK','KOP','KVB','Yamanli','ÇBS','Dogancay']
            ),
            x[col].isin(["BND", "BND2", "TFB", "TFB3", "TFB4", "KNT"]),
            x[col].isin(["BRS", "ÇKL", "DPZ"])]

outcomes = ["HES", "TERMIK", "RES"]

x["Santral_Type"] = np.select(conditions, outcomes, default='SOLAR')

答案 4 :(得分:0)

最简单的方法可以是.values,例如:

 def f(x0,...xn):
      return('hello or some complicated operation')
 df['newColumn']=[f(r[0],r[1],...,r[n]) for r in df.values]

据我所知,此方法的缺点是您不能按名称引用列值,而只能按位置引用,并且没有有关df索引的信息。 优势比迭代,迭代和应用方法快。

希望有帮助