Path: blob/main/crates/polars-ops/src/series/ops/index.rs
6939 views
use polars_core::error::{PolarsResult, polars_ensure};1use polars_core::prelude::arity::unary_elementwise_values;2use polars_core::prelude::{ChunkedArray, DataType, IDX_DTYPE, IdxCa, PolarsIntegerType, Series};3use polars_utils::index::ToIdx;45fn convert<T>(ca: &ChunkedArray<T>, target_len: usize) -> PolarsResult<IdxCa>6where7T: PolarsIntegerType,8T::Native: ToIdx,9{10let target_len = target_len as u64;11Ok(unary_elementwise_values(ca, |v| v.to_idx(target_len)))12}1314pub fn convert_to_unsigned_index(s: &Series, target_len: usize) -> PolarsResult<IdxCa> {15let dtype = s.dtype();16polars_ensure!(dtype.is_integer(), InvalidOperation: "expected integers as index");17if dtype.is_unsigned_integer() {18let nulls_before_cast = s.null_count();19let out = s.cast(&IDX_DTYPE).unwrap();20polars_ensure!(out.null_count() == nulls_before_cast, OutOfBounds: "some integers did not fit polars' index size");21return Ok(out.idx().unwrap().clone());22}23match dtype {24DataType::Int64 => {25let ca = s.i64().unwrap();26convert(ca, target_len)27},28DataType::Int32 => {29let ca = s.i32().unwrap();30convert(ca, target_len)31},32#[cfg(feature = "dtype-i16")]33DataType::Int16 => {34let ca = s.i16().unwrap();35convert(ca, target_len)36},37#[cfg(feature = "dtype-i8")]38DataType::Int8 => {39let ca = s.i8().unwrap();40convert(ca, target_len)41},42_ => unreachable!(),43}44}454647