如何解决CSV重新导入DataFrame后的索引访问KeyError问题?
解决CSV重新加载后索引访问的KeyError问题
这个问题我之前处理过,核心原因是CSV保存与加载时,索引的类型处理不一致导致的。咱们一步步拆解:
问题根源
从Yahoo Finance下载的DataFrame默认把日期设为Timestamp类型的索引,但当你把DataFrame保存为CSV时,这个Timestamp索引会被序列化为字符串格式的日期(比如"2006-01-04")。
默认用pd.read_csv()加载时,pandas不会自动把这个字符串日期列还原成Timestamp索引:要么生成新的整数索引,把原日期列当成普通字符串列;要么即使你指定了索引列,也不会自动解析为Timestamp类型。这时候你再用ms[ms.index[0]]访问,本质是在找名为Timestamp('2006-01-04 00:00:00')(或字符串版本)的列,而你的DataFrame根本没有这个列,自然抛出KeyError。
另外补充一句:其实原始DataFrame里用msft[msft.index[0]]访问本身是个误区——df[col_name]是用来访问列的,如果你想访问某一行数据,正确写法应该是df.loc[df.index[0]],可能你之前是误打误撞能运行?
解决方案
要让加载后的DataFrame和原始数据保持一致的索引类型,只需要在加载CSV时做两个关键设置:
- 指定
index_col=0:把CSV的第一列(也就是原来的索引列)设为DataFrame的索引 - 指定
parse_dates=True:让pandas自动把这个索引列解析为Timestamp类型
可复现代码片段
错误示例(会触发KeyError)
import yfinance as yf import pandas as pd # 下载MSFT数据 msft = yf.download("MSFT", start="2006-01-01", end="2006-01-10") print(f"原始数据索引类型: {type(msft.index[0])}") # 输出:<class 'pandas._libs.tslibs.timestamps.Timestamp'> # 保存为CSV msft.to_csv("msft_data.csv") # 错误的加载方式:未指定索引列和日期解析 ms = pd.read_csv("msft_data.csv") print(f"错误加载后的索引类型: {type(ms.index[0])}") # 输出:<class 'int'>(整数索引) # 执行这行会抛出KeyError: Timestamp('2006-01-04 00:00:00') # ms[ms.index[0]]
修正后的正确代码
import yfinance as yf import pandas as pd # 下载MSFT数据 msft = yf.download("MSFT", start="2006-01-01", end="2006-01-10") print(f"原始数据索引类型: {type(msft.index[0])}") # 正确访问第一行数据的方式 print("原始数据第一行:\n", msft.loc[msft.index[0]]) # 保存CSV(index=True默认开启,可省略) msft.to_csv("msft_data.csv", index=True) # 正确加载:指定索引列并解析日期 ms = pd.read_csv("msft_data.csv", index_col=0, parse_dates=True) print(f"正确加载后的索引类型: {type(ms.index[0])}") # 输出:<class 'pandas._libs.tslibs.timestamps.Timestamp'> # 现在可以和原始数据一样访问行 print("加载后第一行:\n", ms.loc[ms.index[0]])
这样处理后,加载后的DataFrame索引类型和原始数据完全一致,不管是行访问还是其他索引操作都能正常运行。
内容的提问来源于stack exchange,提问作者battilanast
相关产品推荐
相关产品推荐

