获取布尔可空的pandas列

时间:2015-12-29 22:43:28

标签: python pandas

如何创建pandas数据帧,其中dtype列为bool(或者就此而言为int),并支持Nan / missing值。

当我尝试这样的时候:

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隐式转换为object。同样适用于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域并且没有处理具有其特性的浮点运算(我总是有容忍度),我更喜欢比较,舍入误差等)

1 个答案:

答案 0 :(得分:1)

在整数情况下,从熊猫0.24(2019年1月)开始,您可以使用nullable integers来实现所需的目标:

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来实现,布尔值没有等效的东西,但是在this GitHub issuethis PyData talk中讨论了朝该方向的一些工作。您也可以编写自己的extension type来解决这种情况,但是如果您可以将布尔值用整数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