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
的名称,而是使用参数 row
和 city
调用它,然后传递结果该函数调用作为 apply()
的参数。这是行不通的,因为您还没有定义 row
是什么,但是 Python 需要知道 row
是什么才能执行函数调用 distances_to_offices(row, city)
,这发生了BEFORE apply 看到它并有机会定义 row
.
我不确定 df_joined.apply() 是如何工作的,因此在没有更多信息的情况下我无法说出正确的方法。一种策略是在循环的每次迭代中创建一个新的数据 table 对象,方法是过滤 df_joined 以仅保留城市匹配 city
.
的行
我正在计算所有员工的通勤距离(从家到办公室)。这适用于使用这段代码的单个办公室:
#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
的名称,而是使用参数 row
和 city
调用它,然后传递结果该函数调用作为 apply()
的参数。这是行不通的,因为您还没有定义 row
是什么,但是 Python 需要知道 row
是什么才能执行函数调用 distances_to_offices(row, city)
,这发生了BEFORE apply 看到它并有机会定义 row
.
我不确定 df_joined.apply() 是如何工作的,因此在没有更多信息的情况下我无法说出正确的方法。一种策略是在循环的每次迭代中创建一个新的数据 table 对象,方法是过滤 df_joined 以仅保留城市匹配 city
.