Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫无法用双引号推断str类型_Python_Csv_Pandas_Dataframe - Fatal编程技术网

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
vs
object
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