Path: blob/main/crates/polars-ops/src/chunked_array/mode.rs
6939 views
use polars_core::POOL;1use polars_core::prelude::*;23fn mode_indices(groups: GroupsType) -> Vec<IdxSize> {4match groups {5GroupsType::Idx(groups) => {6let Some(max_len) = groups.iter().map(|g| g.1.len()).max() else {7return Vec::new();8};9groups10.into_iter()11.filter(|g| g.1.len() == max_len)12.map(|g| g.0)13.collect()14},15GroupsType::Slice { groups, .. } => {16let Some(max_len) = groups.iter().map(|g| g[1]).max() else {17return Vec::new();18};19groups20.into_iter()21.filter(|g| g[1] == max_len)22.map(|g| g[0])23.collect()24},25}26}2728pub fn mode(s: &Series) -> PolarsResult<Series> {29let parallel = !POOL.current_thread_has_pending_tasks().unwrap_or(false);30let groups = s.group_tuples(parallel, false).unwrap();31let idx = mode_indices(groups);32let idx = IdxCa::from_vec("".into(), idx);33// SAFETY:34// group indices are in bounds35Ok(unsafe { s.take_unchecked(&idx) })36}373839