Skip to main content

polars_core/chunked_array/ops/
nulls.rs

1use polars_arrow::bitmap::Bitmap;
2
3use super::*;
4
5impl<T: PolarsDataType> ChunkedArray<T> {
6    /// Get a mask of the null values.
7    pub fn is_null(&self) -> BooleanChunked {
8        if !self.has_nulls() {
9            return BooleanChunked::full(self.name().clone(), false, self.len());
10        }
11        // dispatch to non-generic function
12        is_null(self.name().clone(), &self.chunks)
13    }
14
15    /// Get a mask of the valid values.
16    pub fn is_not_null(&self) -> BooleanChunked {
17        if self.null_count() == 0 {
18            return BooleanChunked::full(self.name().clone(), true, self.len());
19        }
20        // dispatch to non-generic function
21        is_not_null(self.name().clone(), &self.chunks)
22    }
23}
24
25pub fn is_not_null(name: PlSmallStr, chunks: &[ArrayRef]) -> BooleanChunked {
26    let chunks = chunks.iter().map(|arr| {
27        let bitmap = arr
28            .validity()
29            .cloned()
30            .unwrap_or_else(|| !(&Bitmap::new_zeroed(arr.len())));
31        BooleanArray::from_data_default(bitmap, None)
32    });
33    BooleanChunked::from_chunk_iter(name, chunks)
34}
35
36pub fn is_null(name: PlSmallStr, chunks: &[ArrayRef]) -> BooleanChunked {
37    let chunks = chunks.iter().map(|arr| {
38        let bitmap = arr
39            .validity()
40            .map(|bitmap| !bitmap)
41            .unwrap_or_else(|| Bitmap::new_zeroed(arr.len()));
42        BooleanArray::from_data_default(bitmap, None)
43    });
44    BooleanChunked::from_chunk_iter(name, chunks)
45}
46
47pub fn replace_non_null(name: PlSmallStr, chunks: &[ArrayRef], default: bool) -> BooleanChunked {
48    BooleanChunked::from_chunk_iter(
49        name,
50        chunks.iter().map(|el| {
51            BooleanArray::from_data_default(
52                Bitmap::new_with_value(default, el.len()),
53                el.validity().cloned(),
54            )
55        }),
56    )
57}