def is_na(self) -> bool: blk = self.block if blk.dtype.kind == "V": return True if not blk._can_hold_na: return False values = blk.values if values.size == 0: return True if isinstance(values.dtype, SparseDtype): return False if values.ndim == 1: # TODO(EA2D): no need for special case with 2D EAs val = values[0] if not is_scalar(val) or not isna(val): # ideally isna_all would do this short-circuiting return False return isna_all(values) else: val = values[0][0] if not is_scalar(val) or not isna(val): # ideally isna_all would do this short-circuiting return False return all(isna_all(row) for row in values)
def is_na(self) -> bool: if self.block is None: return True if not self.block._can_hold_na: return False values = self.block.values if isinstance(self.block.values.dtype, SparseDtype): return False elif self.block.is_extension: # TODO(EA2D): no need for special case with 2D EAs values_flat = values else: values_flat = values.ravel(order="K") return isna_all(values_flat)
def is_na(self) -> bool: if self.block is None: return True if not self.block._can_hold_na: return False # Usually it's enough to check but a small fraction of values to see if # a block is NOT null, chunks should help in such cases. 1000 value # was chosen rather arbitrarily. values = self.block.values if is_sparse(self.block.values.dtype): return False elif self.block.is_extension: # TODO(EA2D): no need for special case with 2D EAs values_flat = values else: values_flat = values.ravel(order="K") return isna_all(values_flat)