Dieselbe Antwort wie in dieser Frage , scheint meiner Meinung nach ziemlich doppelt zu sein.
Sie könnten dafür die Builder verwenden oder von Iteratoren sammeln. Das Sammeln von Iteratoren ist oft schnell, aber in diesem Fall müssen Sie den Vec<Country>
durchlaufen zweimal, also sollten Sie einen Benchmark durchführen.
Nachfolgend finden Sie eine Beispielfunktion für beide gezeigten Lösungen.
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(),
)
}
Sobald Sie die Series
haben , können Sie DataFrame::new(columns)
verwenden wobei columns: Vec<Series>
um einen DataFrame
zu erstellen .
Übrigens, wenn Sie maximale Leistung wollen, empfehle ich wirklich connector-x . Es hat Polare und Pfeile integriert und hat eine wahnsinnige Leistung.