如何创建支持nan / missing值的dtype bool(或int)的pandas数据框列?
当我这样尝试时:
d = {'one' : np.ma.MaskedArray([True, False, True, True], mask = [0,0,1,0]), 'two' : pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])} df = pd.DataFrame(d) print (df.dtypes) print (df)
列one
隐式转换为对象。同样类似ints
:
d = {'one' : np.ma.MaskedArray([1,3,2,1], mask = [0,0,1,0]), 'two' : pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])} df = pd.DataFrame(d) print (df.dtypes) print (df)
one
在这里隐式转换为float64
,并且我更喜欢如果我停留在int
域中并且不使用其特质来处理浮点算术(在比较时始终具有容差,舍入误差等)。
在整数情况下,从熊猫0.24(2019年1月)开始,您可以使用可为空的整数来实现所需的功能:
In [165]: df Out[165]: one two a 1.0 1.0 b 3.0 2.0 c NaN 3.0 d 1.0 4.0 In [166]: df.astype('Int64') Out[166]: one two a 1 1 b 3 2 c NaN 3 d 1 4
这可以通过将支持数组转换为来实现arrays.IntegerArray
,并且布尔值没有等效的东西,但是在此GitHub问题和此PyData讨论中讨论了朝该方向的一些工作。您也可以编写自己的扩展类型来解决这种情况,但是如果您可以使用以整数0和1表示的布尔值,可以采用以下一种方法:
In [183]: df.one Out[183]: a True b False c NaN d True Name: one, dtype: object In [184]: (df.one * 1).astype('Int64') Out[184]: a 1 b 0 c NaN d 1 Name: one, dtype: Int64