【发布时间】:2022-01-07 08:10:51
【问题描述】:
我在 pandas 中遇到问题,在读取 CSV 文件并忽略标题 cmets 时,所有列值(第一个除外)都返回为 NaN。
import pandas as pd
start_of_file = [
['# Accession: urn:mavedb:00000040-a-4'],
['# Downloaded (UTC): 2021-11-30 14:12:18.531917'],
['# Licence: CC BY-NC-SA 4.0 (Attribution-NonCommercial-ShareAlike)'],
['# Licence URL: https://creativecommons.org/licenses/by-nc-sa/4.0/'],
['accession', 'hgvs_nt', 'hgvs_splice', 'hgvs_pro', 'score'],
['urn:mavedb:00000040-a-4#1', 'NA', 'NA', 'p.Glu9Phe', '0.007373838825271998'],
]
# Export data frame...
pd.DataFrame(start_of_file).to_csv('test.csv', index=False)
# ... then read data frame while ignoring comments
pd.read_csv('test.csv', comment="#")
0 1 2 3 4
0 accession hgvs_nt hgvs_splice hgvs_pro score
1 urn:mavedb:00000040-a-4 NaN NaN NaN NaN
【问题讨论】:
-
问题出在“urn:mavedb:00000040-a-4#1”字段,该字段的末尾有一个“#”,表示该行的其余部分是注释。您可能还会注意到结果中缺少“#1”部分。由于该行的其余部分被忽略,Pandas 没有为其余四列找到任何值,从而导致 NaN。
-
一个简单的解决方案可能是使用另一个注释字符,它不会在数据字段的任何地方使用。例如,也许是一个“%”。
-
大眼睛!我没有注意到这一点……嗯,我是从 API 中获取这些信息的,所以我认为我不能在读取 CSV 之前操纵标头 cmets。我想知道如果条目以“#”开头,是否有一种方法可以指示视为评论。
-
如果知道表头有多少行,也可以用
skiprows选项跳过表头;那么就不需要设置comment参数了。 -
你也可以用老式的方式逐行读取文件。忽略以“#”开头的行,将其他行放入列表中(就像您在示例中所做的那样;不要忘记删除任何可能的换行符),然后直接从列表列表中创建一个数据框
标签: python pandas dataframe csv