You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在函数中定义空Pandas DataFrame?解决NameError问题

解决NameError问题及代码优化建议

看起来你的问题主要有几个关键点,咱们一步步来解决:

1. 先解决核心的NameError问题

你提到在Python Shell里运行正常,但PyCharm里报NameError: name 'result_df' is not defined,这大概率是脚本缺失必要的导入语句或者PyCharm使用的Python环境和Shell不一致导致的:

(1)补充所有依赖库的导入

在你的脚本最顶部,必须加上这些导入语句——Shell里你可能手动导入过,但PyCharm运行脚本是从头执行的,没有导入的话解释器根本不知道pd、pa这些别名:

# 导入必要库
import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq
import os
import glob
import re

(2)检查PyCharm的Python解释器

确保PyCharm使用的解释器已经安装了pandas和pyarrow:

  • 打开PyCharm的Settings(Mac是Preferences)
  • 找到Project: [你的项目名] -> Python Interpreter
  • 查看列表里有没有pandas和pyarrow,没有的话点击+搜索安装

2. 修复你的myfunc函数逻辑错误

就算解决了NameError,你的函数还有一个致命问题:result_df.append(data)不会修改原DataFrame!因为Pandas的append方法是返回一个新的DataFrame对象,不会原地修改。所以你需要把这行改成:

result_df = result_df.append(data)

另外,直接用open读取JSON再传给pd.read_json有点多余,pd.read_json可以直接接收文件名,还能处理gzip压缩文件(如果你的.gz是压缩的JSON的话),可以简化代码:

def myfunc(filename, filepath):
    # 直接读取JSON文件,支持gzip压缩
    data = pd.read_json(filename, lines=True, encoding='utf-8', compression='infer')
    # 写入parquet
    table_from_pandas = pa.Table.from_pandas(data)
    pq.write_table(table_from_pandas, filepath)
    return data

这样就不需要手动维护result_df了,直接读取后返回即可。


3. 优化主函数的文件查找逻辑

你的主函数里json_fi = glob.glob("*.json")可能找不到文件,因为当前工作目录不一定是/Users/milenko/mario/Json_gzips/,最好用绝对路径:

if __name__ == '__main__':
    basic = '/Users/milenko/mario/Json_gzips/'
    # 用绝对路径查找JSON文件
    json_fi = glob.glob(os.path.join(basic, "*.json"))
    # 如果是.gz压缩的JSON,改成下面这行
    # json_fi = glob.glob(os.path.join(basic, "*.json.gz"))
    
    my_dict = {
        'ticr_calculated_2': 'ticr-2.parquet', 
        'ticr_calculated_3': 'ticr-3.parquet',
        'ticr_calculated_4': 'ticr-4.parquet', 
        'tick_calculated_2': 'tick-2.parquet',
        'tick_calculated_3': 'tick-3.parquet', 
        'tick_calculated_4': 'tick-4.parquet'
    }
    
    for key, value in my_dict.items():
        for f in json_fi:
            # 用basename匹配,避免路径干扰
            if re.match(key, os.path.basename(f)):
                filepath = os.path.join(basic, value)
                myfunc(f, filepath)

按照上面的步骤调整后,应该就能解决你的问题了。如果还有问题,可以检查一下文件路径是否正确,以及JSON文件的格式是否符合lines=True的要求(每行一个JSON对象)。

内容的提问来源于stack exchange,提问作者Djikii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 09:02:35