pandas使用read_csv时skiprows参数失效输出NaN值无法读取指定行
问题根因
你出现NaN的核心原因有两个:
- 调用
pd.DataFrame(data, columns=['Name', 'Bid', 'Ask'])重新构造DataFrame时,如果read_csv读取到的列名和你手动指定的列名不完全匹配,或者读取到的行没有对应列的值,就会生成空值填充为NaN skiprows参数设置不合理,没有精准过滤到你需要的目标行,导致读取了很多无用的空行/不匹配行
解决方案
pandas的skiprows参数支持传入自定义过滤规则,你可以直接指定仅保留需要的行,同时读文件时直接指定需要的列,不需要二次构造DataFrame:
调整后代码
import pandas as pd # 行号计数说明:read_csv默认把CSV文件第一行记为x=0,第二行x=1,以此类推 # 下面的lambda规则表示:保留表头行(x=0),仅保留目标数据行 data = pd.read_csv( 'C:\\Users\\Michael\\Desktop\\Tradition_Basis_RFR_2021_12_05_15_00_00.csv', header=0, usecols=['Name', 'Bid', 'Ask'], # 只读需要的三列,避免多余数据 skiprows=lambda x: x != 0 and x not in [14,15,16,17,18,20,21,22,23] # 按你需要的行对应调整列表里的数值即可 ) data['Mid_value'] = data['Bid']/2 + data['Ask']/2 print(data)
可选写法(手动生成跳过行列表)
如果不习惯用lambda表达式,也可以手动生成要跳过的行号列表:
import pandas as pd # 跳过1-14行(对应CSV行号2到14)、第20行(对应CSV行号21)、25行及以后的所有行 skip_rows = list(range(1,14)) + [19] + list(range(24, 1000)) # 1000设为大于你CSV总行数的数值即可 data = pd.read_csv( 'C:\\Users\\Michael\\Desktop\\Tradition_Basis_RFR_2021_12_05_15_00_00.csv', header=0, usecols=['Name', 'Bid', 'Ask'], skiprows=skip_rows ) data['Mid_value'] = data['Bid']/2 + data['Ask']/2 print(data)
参数调整说明
如果上面的行号和你实际CSV的行号匹配不上,你可以先不加skiprows和usecols读取完整CSV,打印data.index和data.columns确认行号、列名后再调整过滤规则即可。
内容的提问来源于stack exchange,提问作者Atul sanwal
相关产品推荐
相关产品推荐

