如何用“偶尔”引号(R和/或Pandas)导入csv?
我今天遇到了一个新问题。 我发现了一些我正在使用的数据,看起来像这样(在csv
文件中):
Male,White,All Combined,1989,30-31,31,"59,546","18,141","328,235" Male,White,Felony - Drug,1989,30-31,31,"3,861","1,176","328,235" Male,White,Felony - Other,1989,30-31,31,"2,626",800,"328,235" Male,White,Felony - Property,1989,30-31,31,"3,468","1,057","328,235" Male,White,Felony - Violent/Sex,1989,30-31,31,"3,150",960,"328,235" Male,White,Misdemeanor,1989,30-31,31,"46,441","14,149","328,235" Male,White,Status,1989,30-31,31,0,0,"328,235"
很难看到问题,所以让我强调倒数第二列 :
"18,141" "1,176" 800 "1,057" 960 "14,149" 0
问题是逗号被作为string导出的值,而没有逗号的值被导出为数字 。 要清楚的是,数据应该被解释为:
18141 1176 800 1057 960 14149 0
也就是说,它应该全部被解释为数字值。
但是,这让我觉得有些 “标准”应用程序正在导出这样的数据。 目前来说,这是Excel。
是否有任何有效的方法来尝试导入同一列中的这种不同的数据types的平面文件? readr
库中的R( read_csv
)和Python的Pandas( read_csv
)都使用它们的标准标志,通过执行以下操作来解释这些数据:
- 假定它们都应该是数字(不pipe是否在所有“单元格”中都存在引号)。
- 因此,假设这些逗号必须是欧洲式的逗号(而不是美国时间)。
-
所以,这两个软件包都解释如下:
18.141 1.176 800 1.057 960 14.149 0
从readr
说,R( read_csv
库中的readr
)和Pandas( read_csv
)都可以处理这种不一致的情况,并且几乎是正确的。
但是,有没有一个标志,我可以设置或在那里可以处理这样的事情呢? 例如,一个标志说:“删除引用的逗号,他们肯定不是我们的美国小数位的欧洲。
如果没有,是否有足够的需要通过分叉他们的GitHub回购贡献呢?
pandas.read_csv
有thousands=','
参数,您可以设置为一个逗号,所以pandas将读取您的列
0 18141 1 1176 2 800 3 1057 4 960 5 14149 6 0
此外,还有一个converters
参数,需要一个字段的列和相应的函数应用到每列。 你可以用它来进行更复杂的预处理,就像这样(做同样的事情):
pd.read_csv('data.csv', converters={'column_name': lambda x: int(x.replace(',',''))})