在将其导入 pandas 之前更改 CSV
Change CSV before importing it to pandas
我尝试在 pandas 中导入 CSV 文件时遇到问题。文件结构如下:
- 文件的第一个字符是单引号;
- 文件的最后一个字符是单引号;
- CSV 的每一行都以双引号开头,以双引号结尾,后跟 \n
所以我在使用 pandas.read_csv
导入它时遇到问题。理想情况下,我希望 pandas 在导入时忽略单引号和双引号(不考虑数据框的结构,也不将它们作为字符导入)。
我真的不知道在使用 pandas.read_csv
之前是否应该处理 CSV 文件,或者我是否可以选择忽略这些字符。
pd.read_csv
方法的第一个参数是文件名或流。
您可以手动读取文件并在将其交给 pandas 之前操作流。
sio = StringIO("id,category,value\n1,beer,2.40\n2,wine,6.40\n3,$$$Theawsomestuff$$$###,166.00"
pd.read_csv(sio)
id category value
0 1 beer 2.4
1 2 wine 6.4
2 3 $$$Theawsomestuff$$$### 166.0
因此,子类化 StringIO 您可以更改 read
方法的行为
class StreamChanger(StringIO):
def read(self, **kwargs):
data = super().read(**kwargs)
data = data.replace("$", "")
data = data.replace("#", "")
return data
sio = StreamChanger("id,category,value\n1,beer,2.40\n2,wine,6.40\n3,$$$Theawsomestuff$$$###,166.00")
pd.read_csv(sio)
id category value
0 1 beer 2.4
1 2 wine 6.4
2 3 Theawsomestuff 166.0
使用参数 'quoting' 并将值 3 传递给 read_csv。创建数据框后,您应该处理数据中的引号和 headers.
import pandas as pd
df=pd.read_csv('check.txt',doublequote=True,delimiter=',',quoting=3)
df=df.replace({'"': '','\'':''}, regex=True)
df.columns = ['Id1','StartTime','start_lat','start_long','StartGeohash']
print df
样本文件
'Id1,StartTime,start_lat,start_long,StartGeohash
"113,2016-11-01 10:50:28.063,-33.139507,-100.226715,9vbsx2"
"113,2016-11-02 10:49:24.063,-33.139507,-100.226715,9vbsx2"
"115,2016-11-03 10:55:20.063,-36.197660,-101.186050,9y2jcm"'
输出
Id1 StartTime start_lat start_long StartGeohash
0 113 2016-11-01 10:50:28.063 -33.139507 -100.226715 9vbsx2
1 113 2016-11-02 10:49:24.063 -33.139507 -100.226715 9vbsx2
2 115 2016-11-03 10:55:20.063 -36.197660 -101.186050 9y2jcm
我尝试在 pandas 中导入 CSV 文件时遇到问题。文件结构如下:
- 文件的第一个字符是单引号;
- 文件的最后一个字符是单引号;
- CSV 的每一行都以双引号开头,以双引号结尾,后跟 \n
所以我在使用 pandas.read_csv
导入它时遇到问题。理想情况下,我希望 pandas 在导入时忽略单引号和双引号(不考虑数据框的结构,也不将它们作为字符导入)。
我真的不知道在使用 pandas.read_csv
之前是否应该处理 CSV 文件,或者我是否可以选择忽略这些字符。
pd.read_csv
方法的第一个参数是文件名或流。
您可以手动读取文件并在将其交给 pandas 之前操作流。
sio = StringIO("id,category,value\n1,beer,2.40\n2,wine,6.40\n3,$$$Theawsomestuff$$$###,166.00"
pd.read_csv(sio)
id category value
0 1 beer 2.4
1 2 wine 6.4
2 3 $$$Theawsomestuff$$$### 166.0
因此,子类化 StringIO 您可以更改 read
方法的行为
class StreamChanger(StringIO):
def read(self, **kwargs):
data = super().read(**kwargs)
data = data.replace("$", "")
data = data.replace("#", "")
return data
sio = StreamChanger("id,category,value\n1,beer,2.40\n2,wine,6.40\n3,$$$Theawsomestuff$$$###,166.00")
pd.read_csv(sio)
id category value
0 1 beer 2.4
1 2 wine 6.4
2 3 Theawsomestuff 166.0
使用参数 'quoting' 并将值 3 传递给 read_csv。创建数据框后,您应该处理数据中的引号和 headers.
import pandas as pd
df=pd.read_csv('check.txt',doublequote=True,delimiter=',',quoting=3)
df=df.replace({'"': '','\'':''}, regex=True)
df.columns = ['Id1','StartTime','start_lat','start_long','StartGeohash']
print df
样本文件
'Id1,StartTime,start_lat,start_long,StartGeohash
"113,2016-11-01 10:50:28.063,-33.139507,-100.226715,9vbsx2"
"113,2016-11-02 10:49:24.063,-33.139507,-100.226715,9vbsx2"
"115,2016-11-03 10:55:20.063,-36.197660,-101.186050,9y2jcm"'
输出
Id1 StartTime start_lat start_long StartGeohash
0 113 2016-11-01 10:50:28.063 -33.139507 -100.226715 9vbsx2
1 113 2016-11-02 10:49:24.063 -33.139507 -100.226715 9vbsx2
2 115 2016-11-03 10:55:20.063 -36.197660 -101.186050 9y2jcm