Python调用Julia创建空Dataframe时遇UndefVarError问题求助
解决Python调用Julia时创建空DataFrame的
UndefVarError问题 错误核心原因
你遇到的UndefVarError: Dataframe not defined是拼写错误导致的:Julia的DataFrames包中,DataFrame构造函数的正确写法是DataFrame()(首字母F大写),而你代码里写的是小写f的Dataframe(),Julia无法识别这个未定义的变量。
另外还有一个隐藏问题:就算修正拼写,直接创建空DataFrame后给ScoreBin列赋值也会报错——空DataFrame没有任何列,无法直接通过索引赋值。
修正方案
- 统一使用正确的构造函数名
DataFrames.DataFrame()(在Julia代码块中必须用包名限定,因为你没有在eval里导入DataFrames的名称空间) - 创建与原DataFrame列结构匹配的空DataFrame,或者直接基于原数据生成新DataFrame(更高效)
- 优化赋值逻辑,避免循环中直接修改空DataFrame的索引
修正后的完整代码
import numpy as np import julia import pandas as pd import random import copy jl = julia.Julia(runtime=jpath, compiled_modules=False) from julia import Base from julia import Main from julia import DataFrames from julia import Pandas from julia import Tables from julia import Distributed datadict={} n = 10 randomlist = [] for i in range(0,n): num = random.randint(1,100) randomlist.append(num) data = { 'Score': list(randomlist), 'ScoreBin': list(np.zeros(n)) } df = pd.DataFrame(data, columns = ['Score', 'ScoreBin']) datadict["first_df"]=df datadict["second_df"]=df Main.datadict = datadict; Main.eval(""" dictj = Dict(datadict) for (key, value) in datadict dictj[key] = datadict[key] |> Pandas.DataFrame|> DataFrames.DataFrame; end # 基于原数据生成新列后直接构造DataFrame(高效写法) first_scores = dictj["first_df"][:, :Score] first_score_bin = [s > 50 ? 1 : 0 for s in first_scores] dictj["first_df_mod"] = DataFrames.DataFrame(Score=first_scores, ScoreBin=first_score_bin) # 同样处理第二个DataFrame second_scores = dictj["second_df"][:, :Score] second_score_bin = [s > 50 ? 1 : 0 for s in second_scores] dictj["second_df_mod"] = DataFrames.DataFrame(Score=second_scores, ScoreBin=second_score_bin) dfjp=Dict(dictj) for (key, value) in dictj dfjp[key] = dictj[key] |> Pandas.DataFrame; end """)
额外说明
- 优先使用“基于原数据生成新列再构造DataFrame”的方式,比循环赋值更符合Julia的性能优化原则
- 若不想每次写
DataFrames.前缀,可在eval开头添加using DataFrames,Python端已导入DataFrames,Julia环境中该包已加载可用
内容的提问来源于stack exchange,提问作者Malandrinu Malandrinu
相关产品推荐
相关产品推荐

