Calling function from for loop - issue with parameters: NameError: name 'row' is not defined

Calling function from for loop - issue with parameters: NameError: name 'row' is not defined

我正在计算所有员工的通勤距离(从家到办公室)。这适用于使用这段代码的单个办公室:

#Calculate distances from home to all other offices
def distances_to_offices(row):

    row['distance_to_office'] = round(distance.distance(row['Home_geocode'], row['Office_geocode']).km,0)
    return row

df_joined.apply(distances_to_offices, axis=1)

虽然我有很多办公室,但我想遍历它们,为每个办公室创建一个新的距离列。 该函数在没有参数的情况下被调用,但“行”在函数定义中被设置为参数。 当我尝试传递一个城市名称时,我需要使用与函数定义中相同数量的参数来调用该函数,但这并不奏效,因为“行”不被理解为参数:

NameError: name 'row' is not defined

我不明白为什么“行”在函数定义中用作参数,但当我尝试用该参数调用它时却不行。 谁能帮忙解释一下? 我正在考虑这样的事情,但很难选择正确的论点:

# throws Name Error:
def distances_to_offices(row, city):
    col_name = city + "_distance"
    row[col_name] = round(distance.distance(row['Home_geocode'], row['Office_geocode']).km,0)
    return row

offices = ['NY', 'Rio', 'Tokyo']
for city in offices:
    df_joined.apply(distances_to_offices(row, city), axis=1)

不能肯定,因为我不知道 df_joined 是什么,但看起来它是表示数据 table 的某个对象,您可以在其上调用 apply() 传入一个函数,apply() 将循环遍历 table,调用您提供的函数,同时为数据的每一行传入行索引或名称 table.

第一种方法可行,因为您将函数 distances_to_offices 的名称传递给 apply(),而 apply() 使用 row 调用它,该 row 在一些它设置的for循环。

第二种方法失败了,因为您不再传递 distances_to_offices 的名称,而是使用参数 rowcity 调用它,然后传递结果该函数调用作为 apply() 的参数。这是行不通的,因为您还没有定义 row 是什么,但是 Python 需要知道 row 是什么才能执行函数调用 distances_to_offices(row, city),这发生了BEFORE apply 看到它并有机会定义 row.

我不确定 df_joined.apply() 是如何工作的,因此在没有更多信息的情况下我无法说出正确的方法。一种策略是在循环的每次迭代中创建一个新的数据 table 对象,方法是过滤 df_joined 以仅保留城市匹配 city.

的行