简体   繁体   English

在pandas 0.10.1上使用pandas.read_csv指定dtype float32

[英]Specifying dtype float32 with pandas.read_csv on pandas 0.10.1

I'm attempting to read a simple space-separated file with pandas read_csv method. 我正在尝试用pandas read_csv方法读取一个简单的空格分隔文件。 However, pandas doesn't seem to be obeying my dtype argument. 但是,大熊猫似乎并不遵守我的dtype论点。 Maybe I'm incorrectly specifying it? 也许我错误地指定了它?

I've distilled down my somewhat complicated call to read_csv to this simple test case. 我已经read_csv一些复杂的调用read_csv为这个简单的测试用例。 I'm actually using the converters argument in my 'real' scenario but I removed this for simplicity. 我实际上在我的“真实”场景中使用converters参数,但为了简单起见我删除了它。

Below is my ipython session: 以下是我的ipython会话:

>>> cat test.out
a b
0.76398 0.81394
0.32136 0.91063
>>> import pandas
>>> import numpy
>>> x = pandas.read_csv('test.out', dtype={'a': numpy.float32}, delim_whitespace=True)
>>> x
         a        b
0  0.76398  0.81394
1  0.32136  0.91063
>>> x.a.dtype
dtype('float64')

I've also tried this using this with a dtype of numpy.int32 or numpy.int64 . 我已经使用这个有也试过这个dtypenumpy.int32numpy.int64 These choices result in an exception: 这些选择导致异常:

AttributeError: 'NoneType' object has no attribute 'dtype'

I'm assuming the AttributeError is because pandas will not automatically try to convert/truncate the float values into an integer? 我假设AttributeError是因为pandas不会自动尝试将浮点值转换/截断为整数?

I'm running on a 32-bit machine with a 32-bit version of Python. 我正在使用32位版本的Python运行32位机器。

>>> !uname -a
Linux ubuntu 3.0.0-13-generic #22-Ubuntu SMP Wed Nov 2 13:25:36 UTC 2011 i686 i686 i386 GNU/Linux
>>> import platform
>>> platform.architecture()
('32bit', 'ELF')
>>> pandas.__version__
'0.10.1'

0.10.1 doesn't really support float32 very much 0.10.1并不真正支持float32

see this http://pandas.pydata.org/pandas-docs/dev/whatsnew.html#dtype-specification 请参阅此http://pandas.pydata.org/pandas-docs/dev/whatsnew.html#dtype-specification

you can do this in 0.11 like this: 你可以在0.11这样做:

# dont' use dtype converters explicity for the columns you care about
# they will be converted to float64 if possible, or object if they cannot
df = pd.read_csv('test.csv'.....)

#### this is optional and related to the issue you posted ####
# force anything that is not a numeric to nan
# columns are the list of columns that you are interesetd in
df[columns] = df[columns].convert_objects(convert_numeric=True)


    # astype
    df[columns] = df[columns].astype('float32')

see http://pandas.pydata.org/pandas-docs/dev/basics.html#object-conversion

Its not as efficient as doing it directly in read_csv (but that requires
 some low-level changes)

I have confirmed that with 0.11-dev, this DOES work (on 32-bit and 64-bit, results are the same) 我已经确认使用0.11-dev,这个DOES工作(在32位和64位上,结果是相同的)

In [5]: x = pd.read_csv(StringIO.StringIO(data), dtype={'a': np.float32}, delim_whitespace=True)

In [6]: x
Out[6]: 
         a        b
0  0.76398  0.81394
1  0.32136  0.91063

In [7]: x.dtypes
Out[7]: 
a    float32
b    float64
dtype: object

In [8]: pd.__version__
Out[8]: '0.11.0.dev-385ff82'

In [9]: quit()
vagrant@precise32:~/pandas$ uname -a
Linux precise32 3.2.0-23-generic-pae #36-Ubuntu SMP Tue Apr 10 22:19:09 UTC 2012 i686 i686 i386 GNU/Linux
In [22]: df.a.dtype = pd.np.float32

In [23]: df.a.dtype
Out[23]: dtype('float32')

the above works fine for me under pandas 0.10.1 在熊猫0.10.1下,上述工作对我来说很好

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM