Câu trả lời tương tự như trong câu hỏi này , có vẻ như IMO khá trùng lặp.
Bạn có thể sử dụng các trình xây dựng cho điều đó hoặc thu thập từ các trình vòng lặp. Việc thu thập từ các trình lặp thường nhanh chóng, nhưng trong trường hợp này, nó yêu cầu bạn lặp lại Vec<Country>
hai lần, vì vậy bạn nên chuẩn.
Dưới đây là một chức năng ví dụ cho cả hai giải pháp được hiển thị.
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(),
)
}
Khi bạn đã có Series
, bạn có thể sử dụng DataFrame::new(columns)
trong đó columns: Vec<Series>
để tạo DataFrame
.
Btw, nếu bạn muốn có hiệu suất tối đa, tôi thực sự khuyên bạn nên sử dụng connector-x . Nó đã có tích hợp cực và mũi tên và có hiệu suất tuyệt vời.