我正在使用熊猫,并尝试使用嵌套环进行分配。我迭代数据框架,然后在符合某个标准的情况下运行距离函数。我面临两个问题:
-
设置WithCopyWarning:一个值试图在dataframe
的切片副本上设置值 内存错误。它在大型数据集上不起作用。我最终必须终止该过程。
我应该如何更改解决方案以确保它可以使用60,000行的较大数据集进行扩展?
for i, row in df.iterrows():
listy = 0
school = []
if row['LS_Type'] == 'Primary (1-4)':
a = row['Northing']
b = row['Easting']
LS_ID = row['LS_ID']
for j, row2 in df.iterrows():
if row2['LS_Type'] == 'Primary (1-8)':
dist_km = distance(a,b, df.Northing[j], df.Easting[j])
if (listy == 0):
listy = dist_km
school.append([df.LS_Name[j], df.LS_ID[j]])
else:
if dist_km < listy:
listy = dist_km
school[0] = [df.LS_Name[j], int(df.LS_ID[j])]
df['dist_up_prim'][i] = listy
df["closest_up_prim"][i] = school[0]
else:
df['dist_up_prim'][i] = 0
循环的双重是在这里杀死您的原因。查看是否可以将其分解为两个单独的应用步骤。
这是使用df.apply()
和partial
进行嵌套循环的玩具示例:
import math
import pandas as pd
from functools import partial
df = pd.DataFrame.from_dict({'A': [1, 2, 3, 4, 5, 6, 7, 8],
'B': [1, 2, 3, 4, 5, 6, 7, 8]})
def myOtherFunc(row):
if row['A'] <= 4:
return row['B']*row['A']
def myFunc(the_df, row):
if row['A'] <= 2:
other_B = the_df.apply(myOtherFunc, axis=1)
return other_B.mean()
return pd.np.NaN
apply_myFunc_on_df = partial(myFunc, df)
df.apply(apply_myFunc_on_df, axis=1)
您可以以此形式重写代码,该形式会更快。