【问题标题】:pandas read csv ignore newline熊猫读取 csv 忽略换行符
【发布时间】:2018-02-08 21:07:06
【问题描述】:

我有一个数据集(对于那里的 compbio 人来说,它是一个 FASTA),其中散布着换行符,它们不能作为数据的分隔符。

有没有办法让熊猫在导入时忽略换行符,使用任何熊猫读取功能?

样本数据:

>ERR899297.10000174 TGTAATATTGCCTGTAGCGGGAGTTGTTGTCTCAGGATCAGCATTATATCTCAATTGCATGAATCATCGTATTAATGC TATCAAGATCAGCCGATTCT

每个条目都由“>”分隔 数据由换行符分割(仅限于,但实际上并未在全球范围内得到尊重 每行 80 个字符)

【问题讨论】:

标签: python pandas biopython


【解决方案1】:

你需要有另一个标志来告诉熊猫你什么时候真的想改变元组。

例如,我创建了一个文件,其中新行由管道 (|) 编码:

csv = """
col1,col2, col3, col4|
first_col_first_line,2nd_col_first_line,
3rd_col_first_line

de,4rd_col_first_line|
"""
with open("test.csv", "w") as f:
    f.writelines(csv)

然后你用 C 引擎读取它,并将管道精确为 lineterminator:

import pandas as pd
pd.read_csv("test.csv",lineterminator="|", engine="c")

这给了我:

【讨论】:

  • 这假定我的数据用逗号分隔。我的数据由单个字符“>”分隔,并且数据被分成带有换行符的小节,例如:>ERR899297.10000174 TGTAATATTGCCTGTAGCGGGAGTTGTTGTCTCAGGATCAGCATTATATATCTCAATTGCATGAATCATCGTATTAATGC TATCAAGATCAGCCGATTCT read_fwf 怎么样? en.wikipedia.org/wiki/FASTA_format
  • 我试过了,但我最终得到了这个:imgur.com/a/wUFeo 我也无法重塑,因为数据并不总是 2 行。
  • 我认为如果不先清理要导入 DataFrames 的数据就无法做到这一点,这是一种耻辱。这些文件是 40GB+
【解决方案2】:

没有很好的方法来做到这一点。 单独的 BioPython 似乎就足够了,在涉及迭代 BioPython 对象并插入数据帧的混合解决方案中

【讨论】:

    【解决方案3】:

    有没有办法让熊猫在导入时忽略换行符,使用任何熊猫读取功能?

    是的,只需查看pd.read_table() 的文档

    您想指定一个自定义行终止符 (>),然后适当地处理换行符 (\n):将第一个作为列分隔符与 str.split(maxsplit=1) 一起使用,并使用 str.replace 忽略后续换行符(直到下一个终结者):

    #---- EXAMPLE DATA ---
    from io import StringIO
    example_file = StringIO(
    """
    >ERR899297.10000174 
    TGTAATATTGCCTGTAGCGGGAGTTGTTGTCTCAGGATCAGCATTATATATCTCAATTGCATGAATCATCGTATTAATGC
    TATCAAGATCAGCCGATTCT
    ; this comment should not be read into a dataframe
    >ERR123456.12345678
    TGTAATATTGCCTGTAGCGGGAGTTGTTGTCTCAGGATCAGCATTATATATCTCAATTGCATGAATCATCGTATTAATGC
    TATCAAGATCAGCCGATTCT
    ; this comment should not be read into a dataframe
    """
    )
    #----------------------
    
    
    #---- EXAMPLE CODE ---
    import pandas as pd
    df = pd.read_table(
        example_file,           # Your file goes here
        engine = 'c',           # C parser must be used to allow custom lineterminator, see doc
        lineterminator = '>',   # New lines begin with ">"
        skiprows =1,            # File begins with line terminator ">", so output skips first line 
        names = ['raw'],        # A single column which we will split into two
        comment = ';'           # comment character in FASTA format
    )
    
    # The first line break ('\n') separates Column 0 from Column 1
    df[['col0','col1']] = pd.DataFrame.from_records(df.raw.apply(lambda s: s.split(maxsplit=1)))
    
    # All subsequent line breaks (which got left in Column 1) should be ignored
    df['col1'] = df['col1'].apply(lambda s: s.replace('\n',''))
    
    print(df[['col0','col1']])
    
    # Show that col1 no longer contains line breaks
    print('\nExample sequence is:')
    print(df['col1'][0])
    

    返回:

                     col0                                               col1
    0  ERR899297.10000174  TGTAATATTGCCTGTAGCGGGAGTTGTTGTCTCAGGATCAGCATTA...
    1  ERR123456.12345678  TGTAATATTGCCTGTAGCGGGAGTTGTTGTCTCAGGATCAGCATTA...
    
    Example sequence is:
    TGTAATATTGCCTGTAGCGGGAGTTGTTGTCTCAGGATCAGCATTATATATCTCAATTGCATGAATCATCGTATTAATGCTATCAAGATCAGCCGATTCT
    

    【讨论】:

      【解决方案4】:

      pd.read_csv()之后,你可以使用df.split()

       import pandas as pd
      
      
       data = pd.read_csv("test.csv")
       data.split()
      

      【讨论】:

        【解决方案5】:

        这应该只需设置skip_blank_lines=True即可工作。

        skip_blank_lines : bool,默认为 True

        如果为 True,则跳过空行而不是解释为 NaN 值。

        但是,我发现我必须将其设置为 False 才能处理包含新行的数据。很奇怪,除非我误会了。

        Docs

        【讨论】:

          猜你喜欢
          • 2020-10-01
          • 2019-11-30
          • 2018-07-17
          • 2021-02-13
          • 2020-08-05
          • 1970-01-01
          • 2015-03-30
          • 2019-08-30
          • 1970-01-01
          相关资源
          最近更新 更多