从字典读取城市数据时Pandas报NameError,如何批量读取多城市数据?
批量读取城市CSV数据:解决重复代码与NameError问题
嘿,我来帮你梳理下问题并给出修复方案。先看看你原代码里的几个核心问题:
- 重复冗余代码:你重复导入了
csv模块三次,还用csv.reader读取了三个文件,但后面完全没用到这些读取结果,直接用了pandas的read_csv,这部分代码完全是多余的。 - NameError问题:
CITY_DATA[city]里的city变量根本没定义,Python不知道你要取哪个城市的文件名,自然会报错。 - 无批量处理逻辑:你分别写了三次文件读取,没法高效处理所有城市数据。
下面是修复后的完整代码,我会一步步解释:
import pandas as pd import numpy as np import os # 定义城市与文件名的映射,把基础路径单独提取出来,方便后续维护 BASE_PATH = 'C:\\Users\\jasch\\' CITY_DATA = { 'chicago': 'chicago.csv', 'new york city': 'new_york_city.csv', 'washington': 'washington.csv' } # 创建字典存储每个城市处理后的DataFrame,方便后续调用 city_dfs = {} # 遍历所有城市,批量完成读取与数据处理 for city_name, file_name in CITY_DATA.items(): # 拼接完整文件路径,避免硬编码重复路径 full_path = os.path.join(BASE_PATH, file_name) # 读取CSV文件 df = pd.read_csv(full_path) # 统一处理时间列并提取月份 df['Start Time'] = pd.to_datetime(df['Start Time']) df['month'] = df['Start Time'].dt.month # 将处理好的DataFrame存入字典 city_dfs[city_name] = df # 打印当前城市的月份数据(可选,用于验证结果) print(f"--- {city_name} 的月份数据 ---") print(df['month'])
关键改进点说明:
- 清理冗余代码:删掉了没用的
csv模块导入和csv.reader读取逻辑,只保留pandas相关处理(毕竟你后续用的是pandas)。 - 修复NameError:通过遍历
CITY_DATA.items(),直接获取每个城市的名称和对应文件名,再也不需要单独定义未赋值的city变量。 - 批量处理逻辑:用循环一次性处理所有城市,避免重复写三次读取代码,后续新增城市只需在
CITY_DATA里加一行即可。 - 路径优化:把基础路径单独提取,用
os.path.join拼接完整路径,比硬编码全路径更灵活,也减少拼写错误概率。 - 统一存储:每个城市的处理后数据存在
city_dfs字典里,后续调用某城市数据直接用city_dfs['chicago']就能拿到对应的DataFrame。
如果只是想单独处理某个城市,也可以这样写(不会触发NameError):
target_city = 'chicago' df = pd.read_csv(os.path.join(BASE_PATH, CITY_DATA[target_city])) # 后续时间处理等逻辑...
内容的提问来源于stack exchange,提问作者Jasch
相关产品推荐
相关产品推荐

