【问题标题】:Pandas returns NaN values when using read_csv and ignoring commentsPandas 在使用 read_csv 并忽略注释时返回 NaN 值
【发布时间】: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


【解决方案1】:
df = pd.read_csv('test.csv')
df.iloc[[index for index in range(len(df)) if '# ' not in  df['0'][index]]]
display(df)

    0   1   2   3   4
4   accession   hgvs_nt hgvs_splice hgvs_pro    score
5   urn:mavedb:00000040-a-4#1   NaN NaN p.Glu9Phe   0.007373838825271998

df = pd.read_csv('test.csv')
df.iloc[[index for index in range(len(df)) if '#' !=  df['0'][index][0]]]

【讨论】:

    猜你喜欢
    • 2021-10-03
    • 2019-07-24
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    • 2014-11-26
    • 2019-06-03
    • 1970-01-01
    相关资源
    最近更新 更多