熊猫逃离马车返回to_csv

时间:2015-12-31 18:09:40

标签: python pandas

我有一个字符串列,有时在字符串中有回车符:

import pandas as pd
from io import StringIO

datastring = StringIO("""\
country  metric           2011   2012
USA      GDP              7      4
USA      Pop.             2      3
GB       GDP              8      7
""")
df = pd.read_table(datastring, sep='\s\s+')
df.metric = df.metric + '\r'  # append carriage return

print(df)
  country  metric  2011  2012
0     USA   GDP\r     7     4
1     USA  Pop.\r     2     3
2      GB   GDP\r     8     7

写入和读取csv时,数据框已损坏:

df.to_csv('data.csv', index=None)

print(pd.read_csv('data.csv'))
  country metric  2011  2012
0     USA    GDP   NaN   NaN
1     NaN      7     4   NaN
2     USA   Pop.   NaN   NaN
3     NaN      2     3   NaN
4      GB    GDP   NaN   NaN
5     NaN      8     7   NaN

问题

解决此问题的最佳方法是什么?一个显而易见的方法是首先清理数据:

df.metric = df.metric.str.replace('\r', '')

2 个答案:

答案 0 :(得分:9)

指定K ENS4S Gm22848 TSS18078 Cancer 2

lineterminator

答案 1 :(得分:0)

致正在处理此类问题的任何其他人:

@mike-müller 的回答实际上并没有解决这个问题,而且当其他 CSV 阅读器(例如 Excel)读取文件时,文件仍然损坏。您需要在写入文件后而不是在读取文件时修复此问题。

问题在于没有引用包含换行符(\r\n\r\n,具体取决于操作系统样式)的字符串。这不会阻止 CSV 阅读器(例如 Pandas、Excel 等)解析换行符,然后会将加载的 CSV 文件弄乱,使每个未加引号的记录包含多行。

Python 中的通用换行符是 \r\n,因为您通过这些字符剥离字符串,例如str.strip('\r\n')。这将使 Python 识别并覆盖所有操作系统换行样式。

在 Pandas 中,通过 line_terminator='\r\n' 读取 CSV 文件会将所有具有 \n\r 的字符串包装成双引号以保留引用并防止读者稍后解析换行符。

仅提供代码:

pd.to_csv('data.csv', line_terminator='\r\n'))