我有一个代码,我的数据框包含将近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"
**
答案 0 :(得分:2)
如何遍历非常大的数据框 –通常,您不要。您应该对列整体使用某种矢量化操作。例如,您的情况可以是map
和fillna
:
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)
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索引的信息。 优势比迭代,迭代和应用方法快。
希望有帮助