熊猫中的布尔值和缺失值

时间:2019-08-28 13:25:01

标签: python pandas dataframe

我正在尝试找出pandas数据框中的列是否为布尔值(如果是,则为空,是否缺少值等等)。

为了测试我创建的功能,我尝试创建一个带有缺少值的布尔列的数据框。但是,我要说的是,缺少的值在python中专门“未类型化”处理,并且有一些奇怪的行为:

> boolean = pd.Series([True, False, None])
> print(boolean)

0     True
1    False
2     None
dtype: object

因此,当您将None放入列表时,它被视为对象,因为python无法将bool和type(None)= NoneType类型混合回bool。 math.nannumpy.nan也会发生相同的情况。当您试图将熊猫逼入它不想去的区域时,最奇怪的事情就会发生:

> boolean = pd.Series([True, False, np.nan]).astype(bool)
> print(boolean)
0     True
1    False
2     True
dtype: bool

那么'np.nan'被强制转换为'True'?

问题:

  1. 给出一个数据表,其中一列为“对象”类型,但实际上它是一个缺少值的布尔列:我该如何解决呢?在对非缺失值进行过滤之后,它仍然仍然是“对象”类型...我是否需要对每种可想象的数据类型实施每列的try-catch-cast,以便查看列的真实性质?

  2. 我猜想有一个逻辑上的解释,为什么np.nan被强制转换为True,但这是软件pandas / python本身的有害行为,对吗?那我应该提交错误报告吗?

2 个答案:

答案 0 :(得分:2)

Q1:我将从合并开始

np.any(pd.isna(boolean))

标识一列中是否有“无值”,并带有

set(boolean)

您可以识别内部是否只有True,False和None。结合过滤(如果您也喜欢排字),就应该完成。

第二季度:请参阅@WeNYoBen的评论

答案 1 :(得分:0)

我遇到了同样的问题。我想出了以下解决方案:

from pandas import Series
def is_boolean_series(col: Series):
    val = col[~col.isna()].iloc[0]
    return type(val) == bool