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

如何为字典中存储的DataFrame设置文本键?加载预处理报错排查

问题分析与解决方案:循环加载并预处理多个DataFrame

你的问题核心出在DataFrame的加载逻辑上,导致后续无法找到df1这类变量,进而触发NameError。咱们一步步拆解问题,再给出可行的解决方案:

为什么加载代码不生效?

你原来的加载代码里,k = pd.read_csv(v)这一步只是把循环变量k(原本是字符串'df1'/'df2'/'df3')替换成了当前加载的DataFrame,但并没有把这个DataFrame和对应的名字关联存储起来——既没存入字典,也没创建对应的全局/局部变量。所以当你后来尝试用df_dict = {'df1': df1, ...}时,df1这些变量根本就不存在,自然会报错。

正确的加载方式:用字典统一管理DataFrame

与其分散创建多个独立变量,不如直接把所有DataFrame存入一个字典,这样后续遍历、处理都更方便。修改加载代码如下:

import pandas as pd

# 定义文件名与DataFrame名称的映射
DF_DATA = {'df1': 'df1.csv', 'df2': 'df2.csv', 'df3': 'df3.csv'}

# 创建空字典,用来存储加载后的DataFrame
df_dict = {}

# 循环加载每个文件到字典中
for df_name, file_path in DF_DATA.items():
    df_dict[df_name] = pd.read_csv(file_path)
    print(f"已成功加载 {df_name} 数据")

这样df_dict里就有三个键值对:键是'df1'/'df2'/'df3',对应的值就是各自的DataFrame,完全不需要单独创建df1、df2这类变量。

循环遍历字典进行预处理

接下来就可以直接遍历df_dict,同时支持针对不同DataFrame的差异化处理:

for df_name, df in df_dict.items():
    # 通用预处理步骤:设置时间格式、提取小时
    # 注意:这里假设你的时间列名为'datetime',请替换成你实际的列名
    df['datetime'] = pd.to_datetime(df['datetime'])
    df['hour'] = df['datetime'].dt.hour
    
    # 针对不同DataFrame的个性化处理
    if df_name == 'df1':
        # 示例:df1的特殊处理,比如填充某列缺失值
        df['temperature'].fillna(method='ffill', inplace=True)
    elif df_name == 'df2':
        # 示例:df2的特殊处理,比如过滤特定时间段的数据
        df = df[df['datetime'].dt.dayofweek < 5]  # 只保留工作日数据
        df_dict[df_name] = df  # 注意:如果是返回新DataFrame的操作,要更新字典里的内容
    elif df_name == 'df3':
        # 示例:df3的特殊处理,比如新增计算列
        df['total_sales'] = df['quantity'] * df['unit_price']

额外提醒:避免动态创建变量

有些开发者可能会想通过globals()[k] = pd.read_csv(v)来动态创建df1、df2这类变量,但这种方式非常不推荐——会让代码变得混乱,后续调试、维护都很麻烦。用字典集中管理多个DataFrame是更规范、更易维护的做法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:09:54