Python 防止pandas自动推断read_csv中的类型

Python 防止pandas自动推断read_csv中的类型,python,pandas,Python,Pandas,我有一个#分隔的文件,有三列:第一列是整数,第二列看起来像浮点,但不是,第三列是字符串。我试图用pandas.read\u csv In [149]: d = pandas.read_csv('resources/names/fos_names.csv', sep='#', header=None, names=['int_field', 'floatlike_field', 'str_field']) In [150]: d Out[150]: <class 'pandas.cor

我有一个#分隔的文件,有三列:第一列是整数,第二列看起来像浮点,但不是,第三列是字符串。我试图用pandas.read\u csv

In [149]: d = pandas.read_csv('resources/names/fos_names.csv',  sep='#', header=None, names=['int_field', 'floatlike_field', 'str_field'])

In [150]: d
Out[150]: 
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1673 entries, 0 to 1672
Data columns:
int_field          1673  non-null values
floatlike_field    1673  non-null values
str_field          1673  non-null values
dtypes: float64(1), int64(1), object(1)
[149]中的
d=pandas.read_csv('resources/names/fos_names.csv',sep='#',header=None,names=['int_field','floatlike_field','str_field'))
In[150]:d
出[150]:
INT64索引:1673个条目,0到1672
数据列:
int_字段1673非空值
floatlike_字段1673非空值
str_字段1673非空值
数据类型:float64(1)、int64(1)、object(1)

pandas
尝试变得聪明,自动将字段转换为有用的类型。问题是我实际上不希望它这样做(如果我这样做了,我就使用了
转换器
参数)。如何防止熊猫自动转换类型?

我认为最好的办法是先使用numpy将数据作为记录数组读取

# what you described:
In [15]: import numpy as np
In [16]: import pandas
In [17]: x = pandas.read_csv('weird.csv')

In [19]: x.dtypes
Out[19]: 
int_field            int64
floatlike_field    float64  # what you don't want?
str_field           object

In [20]: datatypes = [('int_field','i4'),('floatlike','S10'),('strfield','S10')]

In [21]: y_np = np.loadtxt('weird.csv', dtype=datatypes, delimiter=',', skiprows=1)

In [22]: y_np
Out[22]: 
array([(1, '2.31', 'one'), (2, '3.12', 'two'), (3, '1.32', 'three ')], 
      dtype=[('int_field', '<i4'), ('floatlike', '|S10'), ('strfield', '|S10')])

In [23]: y_pandas = pandas.DataFrame.from_records(y_np)

In [25]: y_pandas.dtypes
Out[25]: 
int_field     int64
floatlike    object  # better?
strfield     object
#您所描述的内容:
在[15]中:将numpy作为np导入
在[16]中:输入大熊猫
在[17]中:x=pandas.read\u csv('wird.csv'))
在[19]:x.d类型中
出[19]:
int_字段int64
floatlike_field float64#你不想要什么?
stru字段对象
在[20]中:数据类型=[('int_field','i4'),('floatlike','S10'),('strfield','S10')]
在[21]中:y_np=np.loadtxt('wird.csv',dtype=datatypes,delimiter=',,skiprows=1)
In[22]:y\u np
出[22]:
数组([(1,'2.31','1'),(2,'3.12','2'),(3,'1.32','3'),

dtype=[('int_field','我计划在即将到来的pandas 0.10文件解析器引擎大修中添加显式列dtype。我不能百分之百地承诺这一点,但随着新基础设施的出现,它应该非常简单(http://wesmckinney.com/blog/?p=543).

这可能是无法避免的。大熊猫(更一般地说是努比)不支持整型的NaN。因为从任何CSV读取都会留下NaN的可能性,所以让它强制始终浮点可能是一个方便的选择。此外,您的类型似乎与打印输出相反。它肯定不会将类似浮点的输入转换为int64,尽管它可能会将类似intlike的输入转换为float64。我不这样认为lieve列出的数据类型的顺序与列的顺序有任何关系,但是对于自动类型强制,这将是非常不幸的。我的印象是,无论类型如何,任何时候信息都会丢失。是的,是的,但是该列将始终是Object类型。您可以使用Object column这大部分是整数。然而,在很多情况下,NaN强制将其转换为浮点列。如果您首先创建一个对象列,然后用可能的NaN整数填充它,它将保持为对象。我认为,如果您只填充其中的任何内容,让Pandas来识别类型,它将为任何数字类型选择浮点NaNs存在。这不仅仅是Pandas的局限性,而且完全是NumPy和Python的局限性。据我所知,没有任何库提供支持NaN的Int。@EMS不要忘记,NumPy还附带了
maskedarray
,它可以将数据标记为缺失/无效/任何…
np。genfromtxt
自然支持
maskedarray
>,这可能很有用。@EMS作为第二条评论,有人在谈论向
int
ndarrays
添加一些类似NaN的值。我很期待它!谢谢韦斯!这是一个好主意。即使现在在0.13.1中也值得添加,因为
读取csv(数据类型,转换器,…)
仍然存在许多问题。如果您仍然希望直接从pandas读取,您也可以这样做:数据类型={strfield':str,'int\u field':int}pd.read\u csv(路径,数据类型=数据类型,…)