Pandas:为什么数字浮点数的默认列类型?

时间:2016-06-23 23:22:26

标签: python csv pandas nan na

我正在使用Pandas 0.18.1和python 2.7.x.我有一个空的数据帧,我先读了。我看到这些列的类型是object,这是可以的。当我分配一行数据时,数值的类型将更改为float64。我期待intint64。为什么会这样?

有没有办法设置一些全局选项让Pandas知道数字值,默认情况下将它们视为int,除非数据有.?例如,[0 1.0, 2.],第一列为int,但其他两列为float64

例如:

>>> df = pd.read_csv('foo.csv', engine='python', keep_default_na=False)
>>> print df.dtypes
bbox_id_seqno    object
type             object
layer            object
ll_x             object
ll_y             object
ur_x             object
ur_y             object
polygon_count    object
dtype: object
>>> df.loc[0] = ['a', 'b', 'c', 1, 2, 3, 4, 5]
>>> print df.dtypes
bbox_id_seqno     object
type              object
layer             object
ll_x             float64
ll_y             float64
ur_x             float64
ur_y             float64
polygon_count    float64
dtype: object

3 个答案:

答案 0 :(得分:6)

Pandas不可能将NaN值存储在整数列中。

这使float成为数据存储的明显默认选择,因为一旦出现缺失值,Pandas就必须更改整个列的数据类型。在实践中经常出现缺失值。

至于为什么这是,它是从Numpy继承的限制。基本上,Pandas需要留出特定的位模式来表示NaN。这对于浮点数是直截了当的,它在IEEE 754标准中定义。对于固定宽度的整数,这样做更笨拙,效率更低。

<强> 更新

大熊猫的惊人新闻0.24。 IntegerArray是一个实验性功能,但可能会使我原来的答案过时。因此,如果您在2019年2月27日或之后阅读此内容,请查看the docs以了解该功能。

答案 1 :(得分:3)

如果您正在读取空数据帧,则可以在读取后显式转换每列的类型。

Map<String, Object> prefs = new HashMap<String, Object>();
prefs.put("profile.default_content_setting_values.notifications", 2);
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("prefs", prefs);
WebDriver driver = new ChromeDriver(options);

如果您不知道空数据框中的列名,您最初可以将所有内容分配为dtypes = { 'bbox_id_seqno': object, 'type': object, 'layer': object, 'll_x': int, 'll_y': int, 'ur_x': int, 'ur_y': int, 'polygon_count': int } df = pd.read_csv('foo.csv', engine='python', keep_default_na=False) for col, dtype in dtypes.iteritems(): df[col] = df[col].astype(dtype) df.loc[0] = ['a', 'b', 'c', 1, 2, 3, 4, 5] >>> df.dtypes bbox_id_seqno object type object layer object ll_x int64 ll_y int64 ur_x int64 ur_y int64 polygon_count int64 dtype: object ,然后让Pandas对其进行排序。

int

答案 2 :(得分:2)

为什么几乎可以肯定灵活性和速度。仅仅因为Pandas到目前为止只看到该列中的整数并不意味着您以后不会尝试添加浮点数,这将要求Pandas返回并更改所有列的类型。 float是最强大/最灵活的数字类型。

没有全局方法可以覆盖该行为(我很清楚),但您可以使用astype方法修改单个DataFrame。

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.astype.html

相关问题