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

我有一个代码,我的数据框包含将近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"

**

beautytai 回答:如何在python中迭代非常大的数据框?

如何遍历非常大的数据框 –通常,您不要。您应该对列整体使用某种矢量化操作。例如,您的情况可以是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')
,

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

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

x.loc[x.PP_Name.isin(['BRS','DPZ']),'Santral_Type'] = "RES"
x.loc[x.PP_Name.isin(['BND','KNT']),'Santral_Type'] = "TERMIK"
hes_list = ['ARK','Dogancay']
x.loc[x.PP_Name.isin(hes_list),'Santral_Type'] = "HES"

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

, 根据{{​​3}}的

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

for row in df.iterrows():
    if row[1]['PP_Name'] in ['ARK','Dogancay']:
        df['Santral_Type] = "HES"
        # and so on

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

,

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

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

import numpy as np
col = 'PP_Name'

conditions = [
        x[col].isin(
['ARK','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')
,

最简单的方法可以是.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索引的信息。 优势比迭代,迭代和应用方法快。

希望有帮助

本文链接:https://www.f2er.com/3114548.html

大家都在问