DataFrame名称显示异常为i,如何重置get_df_name返回的正确名称?
问题原因及解决方法
为什么前两个DataFrame返回名称是i?
你的get_df_name函数通过全局变量查找与目标DataFrame内存地址一致的变量名,但在for循环中,变量i会依次指向df1、df2等对象。当循环处理df1时,globals()['i']就是df1本身,此时列表推导式会同时匹配到i和df1两个变量名,而你取了列表的第一个元素(刚好是i),所以返回错误名称。
解决方法
方法1:修改函数排除循环变量
在查找时排除循环变量i,确保取到原始变量名:
tables=[df1,df2,df3,df4,df5] def get_df_name(df): names = [x for x in globals() if globals()[x] is df and x != 'i'] return names[0] if names else None for i in tables: print(get_df_name(i), list(i.columns))
方法2:直接配对名称与DataFrame(推荐)
避免依赖全局变量查找,直接存储名称和DataFrame的元组,这是最可靠的方式:
tables = [('df1', df1), ('df2', df2), ('df3', df3), ('df4', df4), ('df5', df5)] for name, df in tables: print(name, list(df.columns))
方法3:利用DataFrame的name属性
你之前设置df1.name='df1'无效是因为函数没读取这个属性,修改函数即可:
# 先给每个DataFrame设置name属性 df1.name = 'df1' df2.name = 'df2' df3.name = 'df3' df4.name = 'df4' df5.name = 'df5' tables=[df1,df2,df3,df4,df5] def get_df_name(df): return df.name for i in tables: print(get_df_name(i), list(i.columns))
注意事项
依赖全局变量查找对象名称的方式存在缺陷(比如多个变量指向同一对象时会出错),仅适合临时查看列名的场景,正式代码中建议使用第二种配对存储的方式。
内容的提问来源于stack exchange,提问作者Very_new_to_this
相关产品推荐
相关产品推荐

