【发布时间】:2015-08-21 10:57:44
【问题描述】:
我目前有这个 python 代码(我使用的是 Apache Spark,但很确定这对这个问题没有关系)。
import numpy as np
import pandas as pd
from sklearn import feature_extraction
from sklearn import tree
from pyspark import SparkConf, SparkContext
## Module Constants
APP_NAME = "My Spark Application"
df = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")
def train_tree():
# Do more stuff with the data, call other functions
pass
def main(sc):
cat_columns = ["Sex", "Pclass"]
# PROBLEM IS HERE
cat_dict = df[cat_columns].to_dict(orient='records')
vec = feature_extraction.DictVectorizer()
cat_vector = vec.fit_transform(cat_dict).toarray()
df_vector = pd.DataFrame(cat_vector)
vector_columns = vec.get_feature_names()
df_vector.columns = vector_columns
df_vector.index = df.index
# train data
df = df.drop(cat_columns, axis=1)
df = df.join(df_vector)
train_tree()
if __name__ == "__main__":
# Configure Spark
conf = SparkConf().setAppName(APP_NAME)
conf = conf.setMaster("local[*]")
sc = SparkContext(conf=conf)
# Execute Main functionality
main(sc)
当我运行它时,我得到了错误: cat_dict = df[cat_columns].to_dict(orient='records') UnboundLocalError:赋值前引用了局部变量“df”
我觉得这很令人费解,因为我在文件顶部的main 函数范围之外定义了变量 df。为什么在函数中使用这个变量会触发这个错误?我还尝试将df 变量定义放在if __name__ == "__main__": 语句中(在调用main 函数之前)
现在,显然有很多方法可以解决这个问题,但这更多是为了帮助我更好地理解 Python。所以我想问:
a) 为什么会出现这个错误?
b) 鉴于以下情况,如何最好地解决它:
- 我不想将df 定义放在main 函数中,因为我想在其他函数中访问它。
- 我不想使用课程
- 我不想使用全局变量
- 我不想在函数参数中传递df
【问题讨论】:
-
对于 b) 你将不得不选择一个!您是否阅读过许多其他
UnboundLocalError问题中的任何一个? -
@jonrsharpe 真的没有其他选择吗?我基本上只想访问所有函数中的变量。如果没有额外的复杂性,我无法做到这一点,这似乎很奇怪。
-
你为什么不在
main:global df?? 中让它成为全球性的?? -
你在哪里使用cs?
-
@PadraicCunningham 你能详细说明一下吗?还是你的意思是 sc?
标签: python pandas apache-spark