pandas使用read_csv忽略注释时除首列外其余值为NaN问题
问题原因
- 核心问题出在
pd.read_csv的comment="#"参数逻辑:该参数会将每行中所有#字符后的内容全部判定为注释、直接截断,并非只过滤行首为#的注释行。你数据行第一列的取值urn:mavedb:00000040-a-4#1内部包含#,导致该行#后的所有分隔符、其余列取值都被丢弃,最终只剩第一列#前的内容,其余列全部返回NaN。 - 补充说明:你示例中生成CSV的方式存在冗余:构造DataFrame的前4行注释数据只有1个元素,生成CSV时会自动补全后4列为空值,导出的注释行实际为
# Accession: xxx,,,格式,虽不影响读取,但属于不必要的冗余内容。
解决方案
方案1:固定跳过开头注释(已知注释行数时使用)
如果确定注释固定为开头的4行,直接用skiprows参数跳过即可,不会影响数据内部的#识别:
pd.read_csv('test.csv', skiprows=4)
方案2:动态过滤行首注释(注释行数不固定时使用)
先手动过滤所有以#开头的行,再传给pandas读取,兼顾灵活性和安全性:
import pandas as pd from io import StringIO with open('test.csv', 'r', encoding='utf-8') as f: # 仅过滤行首为#的注释行,保留数据内部的#字符 valid_lines = [line for line in f if not line.lstrip().startswith('#')] df = pd.read_csv(StringIO(''.join(valid_lines)))
内容的提问来源于stack exchange,提问作者irahorecka
相关产品推荐
相关产品推荐

