Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-core/src/frame/projection.rs
8439 views
1
use polars_error::{PolarsResult, polars_err};
2
use polars_utils::aliases::PlHashMap;
3
4
use crate::frame::DataFrame;
5
use crate::prelude::Column;
6
7
pub(super) const LINEAR_SEARCH_LIMIT: usize = 4;
8
9
/// Selects columns by name.
10
pub(super) enum AmortizedColumnSelector<'a> {
11
Direct {
12
df: &'a DataFrame,
13
},
14
NameToIdxMapping {
15
df: &'a DataFrame,
16
name_to_idx: PlHashMap<&'a str, usize>,
17
},
18
}
19
20
impl<'a> AmortizedColumnSelector<'a> {
21
pub(super) fn new(df: &'a DataFrame) -> Self {
22
if df.width() <= LINEAR_SEARCH_LIMIT || df.cached_schema().is_some() {
23
Self::Direct { df }
24
} else {
25
Self::NameToIdxMapping {
26
df,
27
name_to_idx: df
28
.columns()
29
.iter()
30
.enumerate()
31
.map(|(i, s)| (s.name().as_str(), i))
32
.collect(),
33
}
34
}
35
}
36
37
fn select(&self, name: &str) -> PolarsResult<&'a Column> {
38
match self {
39
Self::Direct { df } => df.column(name),
40
Self::NameToIdxMapping { df, name_to_idx } => {
41
let i = *name_to_idx
42
.get(name)
43
.ok_or_else(|| polars_err!(col_not_found = name))?;
44
45
Ok(df.select_at_idx(i).unwrap())
46
},
47
}
48
}
49
50
/// Does not error on duplicate selections.
51
pub(super) fn select_multiple(
52
&self,
53
names: impl IntoIterator<Item = impl AsRef<str>>,
54
) -> PolarsResult<Vec<Column>> {
55
names
56
.into_iter()
57
.map(|name| self.select(name.as_ref()).cloned())
58
.collect()
59
}
60
}
61
62