Pandas loc方法返回行数据为NaN值的技术求助
解决pandas中loc获取列返回NaN的问题
咱们先排查下问题根源,你遇到的loc调用返回NaN的情况,大概率是列名不匹配或者CSV文件解析错误导致的,结合你的场景,我给你一步步分析解决:
第一步:修正CSV文件的解析方式
你导入的是.txt格式的文件,而pd.read_csv默认用逗号作为分隔符,但你的数据明显是用空格分隔的——这会导致pandas无法正确识别列,进而后续用loc找列时找不到对应内容,返回NaN。
先调整导入代码,用正则匹配任意空白字符作为分隔符:
file = 'es.txt' # 用\s+匹配任意数量的空格/制表符作为分隔符 data = pd.read_csv(file, sep='\s+') # 先打印所有列名,确认是否正确识别 print("所有列名:", data.columns.tolist())
第二步:确认目标列名的准确性
接下来检查你要提取的13列名称,是否和data.columns输出的列名完全一致:
- 注意大小写(比如
Open和open是两个不同的列名) - 注意特殊字符和空格(比如
# of Trades里的空格不能少,也不能多) - 避免拼写错误(比如把
Last写成Las)
这些细微的差异都会导致loc找不到对应列,最终返回NaN。
第三步:正确提取指定列
确认列名无误后,就可以提取你需要的13列了,两种方式都可以:
# 替换成你实际需要的13列名称 target_columns = ['Date Time', 'Open', 'High', 'Low', 'Last', 'Volume', '# of Trades', ...] # 方法1:用loc提取(更清晰,明确行和列的范围) filtered_data = data.loc[:, target_columns] # 方法2:直接索引(更简洁) filtered_data = data[target_columns] # 查看结果 print(filtered_data.head())
额外排查:如果列名仍识别错误
如果上面的步骤还是没解决,可能是文件的第一行(列名行)有格式问题,你可以手动指定列名:
# 手动定义所有59列的名称(根据你的实际数据补全) column_names = ['Date Time', 'Open', 'High', 'Low', 'Last', 'Volume', '# of Trades', ...] # header=0表示用文件的第一行作为列名,若文件没有列名行则改成header=None data = pd.read_csv(file, sep='\s+', names=column_names, header=0)
这样处理后,loc就能正确定位到你需要的列,不会再返回NaN了。
内容的提问来源于stack exchange,提问作者funk101
相关产品推荐
相关产品推荐

