我有一个Numpy数组,它具有任意的平面结构数据类型,其中一些列是整数,一些列是datetime64
,一些是浮点等
>>> import numpy as np
>>> ar = np.array([(1, -1), (-1, 2)], dtype=[('a', 'i2'), ('b', 'i4')])
Pandas数据帧是从这个numpy数组中直接创建的,完全遵循其模式:
>>> import pandas as pd
>>> df = pd.DataFrame(ar)
>>> df
a b
0 1 -1
1 -1 2
>>> df.dtypes
a int16
b int32
dtype: object
现在我想说的是,将这个数据帧中的所有-1值替换为NA
,同时尽可能地保留原始数据类型。基本上是这样的:
>>> df_with_na = df.replace(-1, pd.NA)
>>> df_with_na
a b
0 1 <NA>
1 <NA> 2
只是这不起作用,因为列dtypes已转换为对象:
>>> df_with_na.dtypes
a object
b object
dtype: object
其与仅仅将CCD_ 3映射到CCD_
>>> df_with_na.dtypes
a Int16
b Int32
dtype: object
有没有一种方法可以将int16
等盲目地转换为屏蔽的可为null的扩展类型,或者最好是使带有NA
的replace
更改为扩展类型(如果它最初不是(,而不必编写而另一组具有所有可能扩展的查找表?
我建议在对数据帧执行任何操作之前,先将所有的dtype转换为可为null的dtype:
>>> df.dtypes
a int16
b int32
dtype: object
>>> df.convert_dtypes().dtypes
a Int16
b Int32
dtype: object
为了安全起见,您可能需要将convert_integer
到False
之外的所有夸尔格都设置为安全的。