Същият отговор като в този въпрос , изглежда доста дубликат IMO.
Можете да използвате конструкторите за това или да събирате от итератори. Събирането от итератори често е бързо, но в този случай изисква да направите цикъл на Vec<Country>
два пъти, така че трябва да направите сравнителен анализ.
По-долу е примерна функция и за двете показани решения.
use polars::prelude::*;
struct Country {
country: String,
count: i64,
}
fn example_1(values: &[Country]) -> (Series, Series) {
let ca_country: Utf8Chunked = values.iter().map(|v| &*v.country).collect();
let ca_count: NoNull<Int64Chunked> = values.iter().map(|v| v.count).collect();
let mut s_country: Series = ca_country.into();
let mut s_count: Series = ca_count.into_inner().into();
s_country.rename("country");
s_count.rename("country");
(s_count, s_country)
}
fn example_2(values: &[Country]) -> (Series, Series) {
let mut country_builder = Utf8ChunkedBuilder::new("country", values.len(), values.len() * 5);
let mut count_builder = PrimitiveChunkedBuilder::<Int64Type>::new("count", values.len());
values.iter().for_each(|v| {
country_builder.append_value(&v.country);
count_builder.append_value(v.count)
});
(
count_builder.finish().into(),
country_builder.finish().into(),
)
}
След като получите Series
, можете да използвате DataFrame::new(columns)
където columns: Vec<Series>
за създаване на DataFrame
.
Между другото, ако искате максимална производителност, наистина препоръчвам connector-x . Има интеграция на поляри и стрелки и има невероятна производителност.