使用嵌套循环导致内存错误的熊猫分配



我正在使用熊猫,并尝试使用嵌套环进行分配。我迭代数据框架,然后在符合某个标准的情况下运行距离函数。我面临两个问题:

  1. 设置WithCopyWarning:一个值试图在dataframe

  2. 的切片副本上设置值
  3. 内存错误。它在大型数据集上不起作用。我最终必须终止该过程。

我应该如何更改解决方案以确保它可以使用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)

您可以以此形式重写代码,该形式会更快。

最新更新