Python 熊猫无法用双引号推断str类型
我想通过Python 熊猫无法用双引号推断str类型,python,csv,pandas,dataframe,Python,Csv,Pandas,Dataframe,我想通过pandas.read\u csv()从csv文件导入数据。“我的数据”的一种类型是带“”的字符串(但这些字符串是表示类别的数字)。我发现pandas无法将字符串推断为“object”类型,它将字符串推断为int64。请参见以下示例: a、 csv: pandas.read_csv('a.csv')。数据类型提供以下输出: uid:int64 f_1:int64 f_2:float64 f_1的类型被推断为'int64',而不是'object' 但是,如果我替换所有“在a.csv中转换
pandas.read\u csv()
从csv文件导入数据。“我的数据”的一种类型是带“”的字符串(但这些字符串是表示类别的数字)。我发现pandas无法将字符串推断为“object”
类型,它将字符串推断为int64
。请参见以下示例:
a、 csv:
pandas.read_csv('a.csv')。数据类型提供以下输出:
uid:int64
f_1:int64
f_2:float64
f_1
的类型被推断为'int64'
,而不是'object'
但是,如果我替换所有“
在a.csv中转换为”
,则可以将f_1
正确推断为“对象”
。如何在不修改'a.csv'
的情况下防止错误的推断?另一个问题是,为什么pandas将字符串推断为'object'
类型而不是'str'
类型?您可以通过在dtype可选参数中提供列名或字典,在read\u csv调用中强制进行推断,请参阅read_csv上的pandas文档。我认为您需要在以下内容中添加参数skipinitialspace
:
skipinitialspace:布尔值,默认为False,在分隔符后跳过空格
测试:
如果要从列f_1
中删除第一个和最后一个字符”
,请使用转换器:
import pandas as pd
import io
temp=u"""uid, f_1, f_2
1, "1", 1.19
2, "2", 2.3
3, "0", 4.8"""
print pd.read_csv(io.StringIO(temp))
uid f_1 f_2
0 1 "1" 1.19
1 2 "2" 2.30
2 3 "0" 4.80
#remove "
def converter(x):
return x.strip('"')
#define each column
converters={'f_1': converter}
df = pd.read_csv(io.StringIO(temp), skipinitialspace=True, converters = converters)
print df
uid f_1 f_2
0 1 1 1.19
1 2 2 2.30
2 3 0 4.80
print df.dtypes
uid int64
f_1 object
f_2 float64
dtype: object
如果需要将integer
列f_1
转换为string
请使用dtype
:
import pandas as pd
import io
temp=u"""uid, f_1, f_2
1, 1, 1.19
2, 2, 2.3
3, 0, 4.8"""
print pd.read_csv(io.StringIO(temp)).dtypes
uid int64
f_1 int64
f_2 float64
dtype: object
df = pd.read_csv(io.StringIO(temp), skipinitialspace=True, dtype = {'f_1' : str })
print df
uid f_1 f_2
0 1 1 1.19
1 2 2 2.30
2 3 0 4.80
print df.dtypes
uid int64
f_1 object
f_2 float64
dtype: object
注意:不要忘记将io.StringIO(temp)
更改为a.csv
解释str
vsobject
is.对于后者,numpy没有str类型,只有特定长度的str。由于列通常是混合长度,熊猫使用object作为字符串以提高数据存储效率。前者可能是一个bug,请发布在github上:欢迎使用Stackoverflow。您可以检查,如何te可以工作。谢谢你的工作!我发现很奇怪,当我使用你的小样本时,它可以工作,但是当pandas尝试加载更大的文件时(在我的例子中,200MB或更大),即使我尝试了skipinitialspace=True
,它仍然失败。但是dtype=…
有效,所以无论如何,谢谢你的建议。如果有帮助,你可以回答我的问题。谢谢。
import pandas as pd
import io
temp=u"""uid, f_1, f_2
1, "1", 1.19
2, "2", 2.3
3, "0", 4.8"""
print pd.read_csv(io.StringIO(temp))
uid f_1 f_2
0 1 "1" 1.19
1 2 "2" 2.30
2 3 "0" 4.80
#remove "
def converter(x):
return x.strip('"')
#define each column
converters={'f_1': converter}
df = pd.read_csv(io.StringIO(temp), skipinitialspace=True, converters = converters)
print df
uid f_1 f_2
0 1 1 1.19
1 2 2 2.30
2 3 0 4.80
print df.dtypes
uid int64
f_1 object
f_2 float64
dtype: object
import pandas as pd
import io
temp=u"""uid, f_1, f_2
1, 1, 1.19
2, 2, 2.3
3, 0, 4.8"""
print pd.read_csv(io.StringIO(temp)).dtypes
uid int64
f_1 int64
f_2 float64
dtype: object
df = pd.read_csv(io.StringIO(temp), skipinitialspace=True, dtype = {'f_1' : str })
print df
uid f_1 f_2
0 1 1 1.19
1 2 2 2.30
2 3 0 4.80
print df.dtypes
uid int64
f_1 object
f_2 float64
dtype: object