pandas dataframe to_csv适用于sep =' \ n'但不是sep =' \ t'

时间:2017-11-20 09:20:48

标签: python python-2.7 pandas csv

我尝试将大型数据框打印到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"       
"

3 个答案:

答案 0 :(得分:0)

您可以尝试使用

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'

希望这很有用

答案 1 :(得分:0)

问题是所有行都在"中,然后获得一列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)

答案 2 :(得分:0)

您是将数据保存为.tsv格式吗? 您的数据是tsv文件,因为您使用'\ t'分隔数据,这是tab。 csv文件必须用“,”分隔。

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

分隔

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