如何修复CSV导入函数,用字典值作为DataFrame名并按Nr分组拼接
原代码存在的核心问题
- 未实现自定义命名DataFrame的核心目标:现有代码的操作是把字典里对应
New_ID键存储的字符串值(比如'0905a')直接替换为读取得到的DataFrame对象,并没有创建名为0905a的独立DataFrame变量,后续直接调用0905a时会触发NameError报错。 - 路径硬编码无法适配多文件夹复用需求:写死的
C:/path/路径无法灵活切换读取目录,每次换文件夹都需要修改函数内部代码。 - 你提供的字典列表示例存在语法错误:第一个字典的
'Nr'值0905缺失开头的单引号,直接运行会触发语法解析失败。
适配需求的可落地方案
核心思路是不要强行动态创建独立的全局变量(这类写法对初学者极不友好,后续调试、溯源难度极高),改用结构化字典存储所有自定义命名的DataFrame,完全覆盖你后续的格式调整、分组合并需求。
改造后的可复用导入函数
import pandas as pd from collections import defaultdict def import_csv(CSVdict, base_path="C:/默认存储路径/"): # 初始化存储容器:键为自定义的New_ID,值关联对应DataFrame和分组用的Nr标识 df_store = {} for item in CSVdict: # 拼接完整CSV文件路径 full_path = f"{base_path}{item['csvDatei']}.csv" # 按原配置读取CSV文件 df = pd.read_csv(full_path, sep=';', decimal=',') # 按自定义规则存入存储容器 df_store[item['New_ID']] = { "data": df, "group_tag": item['Nr'] } return df_store
调用示例
先修正原字典的语法错误,再传入对应路径调用即可:
# 修正语法后的映射字典 csv_mapping = [ {'Nr': '0905', 'New_ID': '0905a', 'csvDatei': 'LG__380'}, {'Nr': '0905', 'New_ID': '0905b', 'csvDatei': 'LG__376'}, {'Nr': '0955', 'New_ID': '0955a', 'csvDatei': 'LG__53'}, {'Nr': '0955', 'New_ID': '0955b', 'csvDatei': 'LG__50'} ] # 更换读取文件夹时,仅需修改base_path参数,无需改动函数内部逻辑 my_dfs = import_csv(csv_mapping, base_path="D:/目标读取文件夹/")
后续格式调整、按Nr合并的实现
# 1. 逐个对存储的DataFrame做独立格式调整 for new_id, info in my_dfs.items(): # 在此处替换为你实际需要的格式调整逻辑,比如列名修改、数据类型转换、空值处理等 info["data"] = info["data"].dropna() info["data"]["source_tag"] = new_id # 可添加溯源标记列 # 2. 按Nr字段值对DataFrame分组 grouped_dfs = defaultdict(list) for info in my_dfs.values(): grouped_dfs[info["group_tag"]].append(info["data"]) # 3. 对同组的DataFrame执行pd.concat合并 final_result = { nr: pd.concat(df_list, ignore_index=True) for nr, df_list in grouped_dfs.items() }
如果你确实需要让
New_ID的字符串对应为可直接调用的独立变量,可以在导入完成后通过全局变量字典赋值实现,但不推荐初学者使用这类写法,会大幅降低代码可维护性。
内容的提问来源于stack exchange,提问作者J. Susan
相关产品推荐
相关产品推荐

