【问题标题】:pandas dataframe to_csv works with sep='\n' but not sep='\t'熊猫数据框 to_csv 适用于 sep='\n' 但不适用于 sep='\t'
【发布时间】:2018-05-03 11:15:15
【问题描述】:

我尝试将我的大数据框打印到 csv 文件,但制表符分隔 sep='\t' 不起作用。然后我用换行符sep='\n' 进行测试,看起来工作正常,用换行符打破所有元素。这里可能有什么问题?

代码就是这么简单

df_M.to_csv('report'+filename, header=True, sep='\t', index=False)

数据示例(蛋白质一栏很长),我用|标记了分隔位置

"protein |  cl      | pept |    [M] |  [M+1H+]1+ |  [M+2H+]2+"      
"ALBU_HUMAN_UPS Serum albumin (Chain 26-609) - Homo sapiens (Human)|    0|   AWAVAR|        672.37072|            673.378| out-of-range"        
"ALBU_HUMAN_UPS Serum albumin (Chain 26-609) - Homo sapiens (Human)|    0|  TPVSDR| 673.3394900000002|  674.3467700000002|  out-of-range"       
"ALBU_HUMAN_UPS Serum albumin (Chain 26-609) - Homo sapiens (Human)|    0|  NYAEAK| 694.3285900000001|  695.3358700000001|  out-of-range"       
"

【问题讨论】:

  • 嗯,抱歉,我认为您对read_csv 有疑问。如果只过滤前 10 行,它也会失败吗? df_M.iloc[:10].to_csv('report'+filename, header=True, sep='\t', index=False)
  • 你的意思是如果我用你的例子替换我的.to_csv?有用。我可以得到 csv 文件中的前十行,但压缩在一起(不是制表符分隔)@jezrael
  • print (df.columns.tolist()) 是什么?似乎所有数据都在一列中存在问题。

标签: python python-2.7 pandas csv


【解决方案1】:

你可以试试

df_M.to_csv('report'+filename, header=True, sep='\t', index=False, encoding='utf-8')

你也可以在这里看到Pandas Data Frame to_csv with more separator

或者可能是版本问题,因为我无法重现问题,请参阅pd.__version__,前提是最后一个是'0.21.0'

希望对你有用

【讨论】:

    【解决方案2】:

    有问题所有行都在",然后得到一列DataFrame

    所以需要quoting=3 替换QUOTE_NONE,然后通过strip 删除尾随"

    df_M= pd.read_csv('test.csv', sep='|', quoting=3, skipinitialspace=True)
    df_M.iloc[:, 0] = df_M.iloc[:, 0].str.strip('"')
    df_M.iloc[:, -1] = df_M.iloc[:, -1].str.strip('"')
    df_M.columns = df_M.columns.str.strip('"')
    print (df_M)
    
                                                protein   cl         pept   \
    0  ALBU_HUMAN_UPS Serum albumin (Chain 26-609) - ...         0  AWAVAR   
    1  ALBU_HUMAN_UPS Serum albumin (Chain 26-609) - ...         0  TPVSDR   
    2  ALBU_HUMAN_UPS Serum albumin (Chain 26-609) - ...         0  NYAEAK   
    
            [M]   [M+1H+]1+      [M+2H+]2+  
    0  672.37072   673.37800  out-of-range  
    1  673.33949   674.34677  out-of-range  
    2  694.32859   695.33587  out-of-range  
    

    另一种解决方案是将数据读取到一列,然后split

    df = pd.read_csv('test.csv', sep='^')
    cols = df.columns.str.split('|').tolist() 
    df_M = df.iloc[:, 0].str.split('|', expand=True)
    df_M.columns = cols
    print (df_M)
    
                                                protein    cl            pept   \
    0  ALBU_HUMAN_UPS Serum albumin (Chain 26-609) - ...          0     AWAVAR   
    1  ALBU_HUMAN_UPS Serum albumin (Chain 26-609) - ...          0     TPVSDR   
    2  ALBU_HUMAN_UPS Serum albumin (Chain 26-609) - ...          0     NYAEAK   
    
                     [M]            [M+1H+]1+        [M+2H+]2+  
    0           672.37072              673.378    out-of-range  
    1   673.3394900000002    674.3467700000002    out-of-range  
    2   694.3285900000001    695.3358700000001    out-of-range  
    

    最后to_csv 工作得很好:

    df_M.to_csv('report'+filename, header=True, sep='\t', index=False)
    

    【讨论】:

      【解决方案3】:

      您是否将数据保存为 .tsv 格式? 您的数据是 tsv 文件,因为您使用制表符“\t”分隔数据。 csv 文件必须用“,”分隔。

      如果您想以 .csv 格式保存数据,您需要用“,”分隔

      .csv RFC 的链接。 http://www.ietf.org/rfc/rfc4180.txt

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多