程序无法在CSV数据集定位Orange县数据,绘制新冠病例图报错
解决Pandas KeyError: 'Orange'问题(橙县新冠数据无法定位)
报错信息
Traceback (most recent call last): File ~\anaconda3\lib\site-packages\pandas\core\indexes\base.py:3621 in get_loc return self._engine.get_loc(casted_key) File pandas\_libs\index.pyx:136 in pandas._libs.index.IndexEngine.get_loc File pandas\_libs\index.pyx:163 in pandas._libs.index.IndexEngine.get_loc File pandas\_libs\hashtable_class_helper.pxi:5198 in pandas._libs.hashtable.PyObjectHashTable.get_item File pandas\_libs\hashtable_class_helper.pxi:5206 in pandas._libs.hashtable.PyObjectHashTable.get_item KeyError: 'Orange' The above exception was the direct cause of the following exception: Traceback (most recent call last): File ~\OneDrive\Desktop\CSC 314\untitled0.py:48 in <module> df.loc["Orange"] File ~\anaconda3\lib\site-packages\pandas\core\indexing.py:967 in __getitem__ return self._getitem_axis(maybe_callable, axis=axis) File ~\anaconda3\lib\site-packages\pandas\core\indexing.py:1202 in _getitem_axis return self._get_label(key, axis=axis) File ~\anaconda3\lib\site-packages\pandas\core\indexing.py:1153 in _get_label return self.obj.xs(label, axis=axis) File ~\anaconda3\lib\site-packages\pandas\core\generic.py:3864 in xs loc = index.get_loc(key) File ~\anaconda3\lib\site-packages\pandas\core\indexes\base.py:3623 in get_loc raise KeyError(key) from err KeyError: 'Orange'
问题原因
- 数据处理顺序错误:先将全量数据集的
County设为索引,再筛选加州数据,导致索引中包含大量非加州县,后续合并时易丢失目标数据。 - 合并匹配风险:
california_county_stats.txt的索引若未与新冠数据中的加州县名完全匹配(比如大小写、空格差异),会直接剔除橙县数据。 - 冗余代码触发错误:单独的
df.loc["Orange"]行无实际作用,却提前暴露了数据缺失问题。
修复方案
- 调整处理顺序:先筛选加州数据,再设置
County为索引,避免索引混入无关县名。 - 规范
stats文件读取:明确指定其索引为县名列,确保与新冠数据的县名匹配。 - 新增数据验证:合并后检查橙县是否存在,避免直接报错。
- 优化数据提取逻辑,移除冗余代码。
修正后的完整代码
import pandas as pd import matplotlib.pyplot as plt from datetime import datetime # 从GitHub获取新冠死亡数据 covid_url = "https://github.com/CSSEGISandData/COVID-19/raw/master/csse_covid_19_data/csse_covid_19_time_series/" covid_file = "time_series_covid19_deaths_US.csv" covid = pd.read_csv(covid_url + covid_file, delimiter=",") # 数据清洗:重命名列、删除无用字段 covid = covid.rename(columns={"Admin2":"County", "Province_State":"State"}) unused_columns = ["UID", "iso2", "iso3", "code3", "FIPS", "Long_", "Lat", "Country_Region", "Combined_Key"] covid = covid.drop(columns=unused_columns) # 计算每日新增死亡数(从后往前减,避免覆盖原始数据) col_a = covid.columns.get_loc("1/22/20") # 第一个日期列的索引 col_z = covid.shape[1]-1 # 最后一列的索引 for c in range(col_z, col_a, -1): covid.iloc[:, c] = covid.iloc[:,c] - covid.iloc[:,c-1] # 读取加州县统计数据,指定第一列为索引 stats = pd.read_csv("california_county_stats.txt", delimiter=",", index_col=0) # 先筛选加州数据,再设置索引(关键修复) covid_ca = covid[covid["State"] == "California"].drop(columns=['State']) covid_ca = covid_ca.set_index("County") # 合并两个数据集 df = pd.merge(stats, covid_ca, left_index=True, right_index=True) # 验证橙县是否存在 if "Orange" not in df.index: print("警告:数据集中未找到橙县数据,请检查stats文件或covid数据的县名匹配") print("可用县名:", df.index.tolist()) else: # 提取橙县的日期和新增数据 first_col = df.columns.get_loc("1/22/20") last_col = df.shape[1]-1 orange_data = df.loc["Orange", first_col:last_col] y_vals = orange_data.values x_vals = [datetime.strptime(day, '%m/%d/%y') for day in orange_data.index] # 绘制每日新增死亡数柱状图 plt.figure(figsize=(10,5)) plt.gca().yaxis.grid() plt.bar(x_vals, y_vals, width=1, color="orangered") plt.title("橙县每日新增COVID-19死亡数", fontsize=14, pad=15) plt.show() # 计算7日滚动平均值并绘图 orange_avg = orange_data.rolling(7).mean() plt.figure(figsize=(10,5)) plt.gca().yaxis.grid() plt.plot(x_vals, orange_avg, "-", color="orangered") plt.fill_between(x_vals, orange_avg, color="orangered", alpha=0.4) plt.title("橙县每日新增COVID-19死亡数(7日滚动平均)", fontsize=14, pad=15) plt.show()
额外提示
- 若仍报错,检查
california_county_stats.txt的第一列是否为县名,且橙县名称为Orange(无大小写错误、无额外空格)。 - 可在合并后添加
print(df.index)查看所有可用县名,确认橙县是否存在。
内容的提问来源于stack exchange,提问作者vikwillberg
相关产品推荐
相关产品推荐

