Python新手用Pandas绘制Yahoo数据时某列变为NaN的问题
解决Yahoo CSV数据在Pandas中列变为NaN的问题
嘿,作为刚接触Python和Pandas的新手,遇到这种数据预处理的小坑太正常了!我来帮你一步步排查和解决这个问题:
1. 先确认CSV读取是否正确
Yahoo导出的CSV有时候会有隐藏的格式问题,先从基础读取环节排查:
- 用
print(df.head())打印前几行数据,看看目标列在读取后是不是已经出现NaN,或者有没有奇怪的字符(比如$、千分位逗号、首尾空格) - 检查列名是否准确:Yahoo的CSV列名可能带首尾空格(比如
"Close "而不是"Close"),用print(df.columns)查看所有列名,确保你调用的列名完全匹配。如果有空格,先清理列名:df.columns = df.columns.str.strip() # 去掉所有列名的首尾空格
2. 检查数据类型是否被误解析
如果目标列被Pandas识别为object(字符串类型),后续操作很容易出现NaN。你可以用df.dtypes查看各列类型,然后做针对性转换:
- 如果列里有货币符号(比如
$)或千分位逗号,先清理再转数值:# 假设目标列是"Close",先去掉$和逗号 df['Close'] = df['Close'].str.replace('$', '', regex=False) df['Close'] = df['Close'].str.replace(',', '', regex=False) # 转换为数值类型,无法转换的内容会变成NaN(方便后续排查异常) df['Close'] = pd.to_numeric(df['Close'], errors='coerce')
3. 排查原始数据的异常行
有时候Yahoo的CSV会混入重复表头、注释行或者无效数据:
- 用
df[df['你的目标列'].isna()]定位到所有NaN的行,然后去原始CSV里查看这些行的内容,是不是有非数值的文本 - 如果是重复表头,可以在读取时跳过:
pd.read_csv('your_data.csv', skiprows=[1])(假设第二行是重复表头)
4. 验证处理后的数据
完成以上步骤后,再用df['你的目标列'].describe()查看数据统计信息,确认没有大量NaN,然后尝试绘图或者转序列:
# 绘制目标列 df['你的目标列'].plot(kind='line') # 转换为序列(可选:去掉NaN值) target_series = df['你的目标列'].dropna()
内容的提问来源于stack exchange,提问作者Silent
相关产品推荐
相关产品推荐

