Python函数内创建的pandas DataFrame外部无法访问、为空怎么解决?
问题根源
你遇到的是Python变量作用域规则导致的问题:函数内部通过赋值创建的变量默认属于局部作用域,仅在函数运行期间有效,函数执行结束后局部变量会被回收,因此全局作用域无法直接访问。
场景一解决方案
将函数内生成的DataFrame通过return语句返回,在函数外部接收返回值即可正常访问,修正后代码如下:
import pandas as pd # 从CSV文件加载数据 def LoadFiles(): x = pd.read_csv('columns_description.csv', index_col=None) print("列描述信息") print(f"行数/记录数: {x.shape[0]}") print(f"列数/变量数: {x.shape[1]}") # 新增返回语句,将局部变量返回 return x # 外部接收函数返回的DataFrame x = LoadFiles() x.head()
场景二解决方案
同样通过return返回内部生成的派生汇总DataFrame即可,同时注意你原代码中存在逻辑错误:给var_y赋值的第一个元素误写为了整个数据集y,实际应该是列名var,修正后代码如下:
import pandas as pd y = pd.read_csv('columns_description.csv', index_col=None) def refresh_y(): var_y = pd.DataFrame(columns=['变量','唯一值数量']) for i, var in enumerate(y.columns): # 修正原代码的赋值错误 var_y.loc[i] = [var, y[var].nunique()] # 返回汇总后的派生表 return var_y # 外部接收返回的汇总表 var_y = refresh_y()
后续如果基础数据集y更新,重新调用refresh_y()即可拿到最新的汇总结果,完全满足批量更新派生数据集的需求。
补充说明
如果特殊场景需要直接修改全局变量,可以在函数内用global关键字声明变量,但该方案会提高代码耦合度,调试难度更高,不推荐作为首选方案,示例如下:
import pandas as pd x = None def LoadFiles(): # 声明x为全局变量 global x x = pd.read_csv('columns_description.csv', index_col=None)
内容的提问来源于stack exchange,提问作者Dilip M Nair
相关产品推荐
相关产品推荐

