我有一个字符串列,它有时会在字符串中包含回车符:
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='ss+')
df.metric = df.metric + 'r' # append carriage return
print(df)
country metric 2011 2012
0 USA GDPr 7 4
1 USA Pop.r 2 3
2 GB GDPr 8 7
向CSV写入和从CSV读取时, Dataframe 损坏:
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', '')
4条答案
按热度按时间vsaztqbk1#
指定
line_terminator
:最新情况:
在最近的Pandas版本中(最初的答案是2015年),参数的名称改为
lineterminator
。p3rjfoxz2#
致正在处理此类问题的其他任何人:
@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
的字符串括在双引号中,以保留引号并防止读者稍后解析换行符。仅提供以下代码:
qvtsj1bj3#
在我的例子中,应用
quoting=csv.QUOTE_ALL
解决了问题。dbf7pr2w4#
我有三个可行的解决方案。在我看来,所有这些都同样强劲。
这个(应该归功于@Shayan Amani)运行得很好,因为现在
read_csv
只将\n
视为行分隔符,因此‘\r’只是一个字符。请注意,to_csv
的行为将因平台而异;在Windows上,行由‘\r\n’分隔。但这不会改变结果,这要归功于read_csv
的skip_blank_lines=True
选项。这个解决方案通过强制对文本列使用引号来解决问题。
另一种选择是在保存时显式指定行分隔符。这样,带有‘\r’的文本现在被引号。