使用pandas.DataFrame.to_csv写入csv文件时如何执行分类整数dtype

问题描述

(该问题已更新,可以更严格地隔离问题)

我在pandas.DataFrame中有分类变量的数据。类别是整数。数据可能缺少值。

import pandas as pd

# Define all dtypes
dtypes = {
    'var_001': pd.api.types.CategoricalDtype(
        categories=[1,2,3,4],ordered=False,),'var_002': pd.UInt8Dtype(),'var_003': pd.api.types.CategoricalDtype(
        categories=[1,4,5],ordered=True,}

# Create a dataframe
df = pd.DataFrame(
    data={
        'var_001': [1,'',3],'var_002': [43,62,99],'var_003': [2,},)

# Convert to the right dtypes (btw,why this cannot be done in the construcor??)
df = df.astype(dtype=dtypes)

dtypes看起来不错:

>>> print(df.dtypes)
var_001    category
var_002       UInt8
var_003    category
dtype: object

数据框中的数据也是如此:

>>> print(df)
  var_001  var_002 var_003
0       1       43       2
1     NaN       62       3
2       3       99       3

但是,当我将数据帧写入csv文件df.to_csv('data.csv',index=False))时,缺少值的变量的值将打印为float而不是整数:

var_001,var_002,var_003
1.0,43,3
3.0,99,3

是否有一种方法可以在写入csv文件时对缺失值的数据也保留整数类别?

解决方法

显然,问题出在不可为空的整数上

在处理丢失的数据中,我们看到熊猫主要使用NaN表示丢失的数据。由于NaN是浮点数,因此这会强制将所有缺少值的整数数组变为浮点数。

https://pandas.pydata.org/pandas-docs/stable/user_guide/integer_na.html

因此,要使分类变量也能缺少值,我们必须将类别定义为可为空的整数:

import pandas as pd

# Create an array with nullable integer values
cat_0_4 = pd.array([0,1,2,3,4],dtype="Int8")

# Define an ordered categorical dtype with nullable integer values
var_dtype = pd.api.types.CategoricalDtype(
    categories=cat_0_4,ordered=True,)

...

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...