Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/docs/source/src/rust/user-guide/expressions/operations.rs
7889 views
1
fn main() -> Result<(), Box<dyn std::error::Error>> {
2
// --8<-- [start:dataframe]
3
use polars::prelude::*;
4
5
let df = df! (
6
"nrs" => &[Some(1), Some(2), Some(3), None, Some(5)],
7
"names" => &["foo", "ham", "spam", "egg", "spam"],
8
"random" => &[0.37454, 0.950714, 0.731994, 0.598658, 0.156019],
9
"groups" => &["A", "A", "B", "A", "B"],
10
)?;
11
12
println!("{}", &df);
13
// --8<-- [end:dataframe]
14
15
// --8<-- [start:arithmetic]
16
let result = df
17
.clone()
18
.lazy()
19
.select([
20
(col("nrs") + lit(5)).alias("nrs + 5"),
21
(col("nrs") - lit(5)).alias("nrs - 5"),
22
(col("nrs") * col("random")).alias("nrs * random"),
23
(col("nrs") / col("random")).alias("nrs / random"),
24
(col("nrs").pow(lit(2))).alias("nrs ** 2"),
25
(col("nrs") % lit(3)).alias("nrs % 3"),
26
])
27
.collect()?;
28
println!("{result}");
29
// --8<-- [end:arithmetic]
30
31
// --8<-- [start:comparison]
32
let result = df
33
.clone()
34
.lazy()
35
.select([
36
col("nrs").gt(1).alias("nrs > 1"),
37
col("nrs").gt_eq(3).alias("nrs >= 3"),
38
col("random").lt_eq(0.2).alias("random < .2"),
39
col("random").lt_eq(0.5).alias("random <= .5"),
40
col("nrs").neq(1).alias("nrs != 1"),
41
col("nrs").eq(1).alias("nrs == 1"),
42
])
43
.collect()?;
44
println!("{result}");
45
// --8<-- [end:comparison]
46
47
// --8<-- [start:boolean]
48
let result = df
49
.clone()
50
.lazy()
51
.select([
52
((col("nrs").is_null()).not().and(col("groups").eq(lit("A"))))
53
.alias("number not null and group A"),
54
(col("random").lt(lit(0.5)).or(col("groups").eq(lit("B"))))
55
.alias("random < 0.5 or group B"),
56
])
57
.collect()?;
58
println!("{result}");
59
// --8<-- [end:boolean]
60
61
// --8<-- [start:bitwise]
62
let result = df
63
.clone()
64
.lazy()
65
.select([
66
col("nrs"),
67
col("nrs").and(lit(6)).alias("nrs & 6"),
68
col("nrs").or(lit(6)).alias("nrs | 6"),
69
col("nrs").not().alias("not nrs"),
70
col("nrs").xor(lit(6)).alias("nrs ^ 6"),
71
])
72
.collect()?;
73
println!("{result}");
74
// --8<-- [end:bitwise]
75
76
// --8<-- [start:count]
77
use rand::distr::{Distribution, Uniform};
78
use rand::rng;
79
80
let mut rng = rng();
81
let between = Uniform::new_inclusive(0, 100_000).unwrap();
82
let arr: Vec<u32> = between.sample_iter(&mut rng).take(100_100).collect();
83
84
let long_df = df!(
85
"numbers" => &arr
86
)?;
87
88
let result = long_df
89
.lazy()
90
.select([
91
col("numbers").n_unique().alias("n_unique"),
92
col("numbers").approx_n_unique().alias("approx_n_unique"),
93
])
94
.collect()?;
95
println!("{result}");
96
// --8<-- [end:count]
97
98
// --8<-- [start:value_counts]
99
let result = df
100
.clone()
101
.lazy()
102
.select([col("names")
103
.value_counts(false, false, "count", false)
104
.alias("value_counts")])
105
.collect()?;
106
println!("{result}");
107
// --8<-- [end:value_counts]
108
109
// --8<-- [start:unique_counts]
110
let result = df
111
.clone()
112
.lazy()
113
.select([
114
col("names").unique_stable().alias("unique"),
115
col("names").unique_counts().alias("unique_counts"),
116
])
117
.collect()?;
118
println!("{result}");
119
// --8<-- [end:unique_counts]
120
121
// --8<-- [start:collatz]
122
let result = df
123
.lazy()
124
.select([
125
col("nrs"),
126
when((col("nrs") % lit(2)).eq(lit(1)))
127
.then(lit(3) * col("nrs") + lit(1))
128
.otherwise(col("nrs") / lit(2))
129
.alias("Collatz"),
130
])
131
.collect()?;
132
println!("{result}");
133
// --8<-- [end:collatz]
134
135
Ok(())
136
}
137
138