Pandas逃离马车返回TO_CSV

hsgswve4  于 2022-09-21  发布在  其他
关注(0)|答案(4)|浏览(167)

我有一个字符串列,它有时会在字符串中包含回车符:

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', '')
vsaztqbk

vsaztqbk1#

指定line_terminator

print(pd.read_csv('data.csv', line_terminator='n'))

  country  metric  2011  2012
0     USA   GDPr     7     4
1     USA  Pop.r     2     3
2      GB   GDPr     8     7

最新情况:

在最近的Pandas版本中(最初的答案是2015年),参数的名称改为lineterminator

p3rjfoxz

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的字符串括在双引号中,以保留引号并防止读者稍后解析换行符。

仅提供以下代码:

pd.to_csv('data.csv', line_terminator='rn'))
qvtsj1bj

qvtsj1bj3#

在我的例子中,应用quoting=csv.QUOTE_ALL解决了问题。

import csv
pd.to_csv('some_data.csv', quoting=csv.QUOTE_ALL)
dbf7pr2w

dbf7pr2w4#

我有三个可行的解决方案。在我看来,所有这些都同样强劲。

这个(应该归功于@Shayan Amani)运行得很好,因为现在read_csv只将\n视为行分隔符,因此‘\r’只是一个字符。请注意,to_csv的行为将因平台而异;在Windows上,行由‘\r\n’分隔。但这不会改变结果,这要归功于read_csvskip_blank_lines=True选项。

df.to_csv("tmp/test.csv", index=False)
pd.read_csv("tmp/test.csv", lineterminator="n")

这个解决方案通过强制对文本列使用引号来解决问题。

import csv
df.to_csv("tmp/test.csv", index=False, quoting=csv.QUOTE_NONNUMERIC)
pd.read_csv("tmp/test.csv")

另一种选择是在保存时显式指定行分隔符。这样,带有‘\r’的文本现在被引号。

df.to_csv("tmp/test.csv", index=False, line_terminator="rn")
pd.read_csv("tmp/test.csv")

相关问题