问题描述
(该问题已更新,可以更严格地隔离问题)
我在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,)
...