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