python - 尽管使用 Global 关键字访问函数内的变量仍然出错

标签 python python-3.x pandas scope global-variables

我创建了一些全局变量,如下面的代码所示。但是,当我尝试在各个函数中使用它们时,我仍然遇到相同的错误。

请在下面找到我的代码

def create_df():
  global sheet_name, sheet_df 
  for s in sheets:
     sheet_name = s
     sheet_df = pd.read_excel(xls, sheet_name=s)
     sheet_df = sheet_df[sheet_df.columns.difference(sheet_df.filter(like='Derived').columns,sort=False)]
     print("Sheet " + str(s) + " is created as a dataframe successfully")
     transform_stage_1_df()

def transform_stage_1_df():
    global sheet_df 
    sheet_df = pd.melt(sheet_df, id_vars='subject_ID', var_name='headers', value_name='dates')
    sheet_df['header_extracted'] = [x.split("Date")[0] for x in sheet_df['headers']]
    sheet_df['day'] = sheet_df['header_extracted'].str.extract('(\d+)', expand=True).astype(int)
    sheet_df = sheet_df[sheet_df.groupby(['subject_ID','header_extracted'])['dates'].transform('count').ne(0)].copy()
    sheet_df = sheet_df.sort_values(by=['subject_ID','day'])
    sheet_df.drop(['header_extracted', 'day'], axis=1, inplace=True)
print("Stage 1 transformation is complete")


if __name__ == '__main__':
    print("Execution Started")
    print("File read successfully")
    sheets = xls.sheet_names
    sheet_name = sheet_df = Non_Cholesterol = None
    dataFramesDict = dict()
    create_df()
    add_units()
    Non_Cholesterol.to_csv('Output.csv')

基于SO帖子,我已经更新了全局关键字,但仍然收到UnboundLocalError:赋值前引用的局部变量'sheet_df'

UnboundLocalError                         Traceback (most recent call last)
 <ipython-input-210-dc2f8412235d> in <module>
      7     sheet_df = None
       8     dataFramesDict = dict()
  ----> 9     create_df()
 10     Non_Cholesterol.to_csv('C:\\Users' + 
 str('Non_cholesterol.csv'),index=None)
 11     print("Export successful")

 <ipython-input-205-c93604f0da4f> in create_df()
  5         sheet_df =sheet_df[sheet_df.columns.difference(sheet_df.filter(like='Derived').columns,sort=False)]
  6         print("Sheet " + str(s) + " is created as a dataframe 
  successfully")
     ----> 7         transform_stage_1_df()

 <ipython-input-206-b59c70018a9b> in transform_stage_1_df()
  1 def transform_stage_1_df():
  ----> 2     sheet_df = pd.melt(sheet_df, id_vars='subject_ID', 
 var_name='headers', value_name='dates')
  3     sheet_df['header_extracted'] = [x.split("Date")[0] for x in 
 sheet_df['headers']]
  4     sheet_df['day'] = sheet_df['header_extracted'].str.extract('(\d+)', 
 expand=True).astype(int)
  5     sheet_df = 
 sheet_df[sheet_df.groupby(['subject_ID','header_extracted']) 
 ['dates'].transform('count').ne(0)].copy()

  UnboundLocalError: local variable 'sheet_df' referenced before assignment

最佳答案

您需要在脚本主体中初始化变量。当您说“全局变量名”时,这意味着您将访问函数外部的变量,而不是名为“变量名”的局部变量。

# Initialize the variables first
sheet_name = None
sheet_df = None

def create_df():
  global sheet_name, sheet_df 
  for s in sheets:
     sheet_name = s
     sheet_df = pd.read_excel(xls, sheet_name=s)
     sheet_df = sheet_df[sheet_df.columns.difference(sheet_df.filter(like='Derived').columns,sort=False)]
     print("Sheet " + str(s) + " is created as a dataframe successfully")
     transform_stage_1_df()

def transform_stage_1_df():
    global sheet_df 
    sheet_df = pd.melt(sheet_df, id_vars='subject_ID', var_name='headers', value_name='dates')
    sheet_df['header_extracted'] = [x.split("Date")[0] for x in sheet_df['headers']]
    sheet_df['day'] = sheet_df['header_extracted'].str.extract('(\d+)', expand=True).astype(int)
    sheet_df = sheet_df[sheet_df.groupby(['subject_ID','header_extracted'])['dates'].transform('count').ne(0)].copy()
    sheet_df = sheet_df.sort_values(by=['subject_ID','day'])
    sheet_df.drop(['header_extracted', 'day'], axis=1, inplace=True)
    print("Stage 1 transformation is complete")


if __name__ == '__main__':
   print("Execution Started")
   xls = pd.ExcelFile('C:\\Users\\All.xlsx')
   print("File read successfully")
   sheets = xls.sheet_names
   dataFramesDict = dict()
   create_df()

关于python - 尽管使用 Global 关键字访问函数内的变量仍然出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57307386/

相关文章:

python - 更改创建 .pyc 文件的目录

python - 根据索引值用系列填充多个缺失值

pandas - 将日期拆分为新列的自定义转换器

Python 多处理冲突添加到列表

python - 遍历 4 个数字的组合

python-3.x - Sklearn中如何使用KBinsDiscretizer将连续数据放入bin中?

python - 寻找提高使用 Pandas 库的 python 脚本速度的方法

python找到两个numpy数组的交点

python - 在 Python 2.7 中使用加号 (+) 连接两个字符串是否合适,而不是使用大括号 ({}) 和 `format` 连接?

python - 使用子进程在python 3中使用GPG加密文件