इस सवाल<के समान उत्तर /ए> , काफी डुप्लिकेट आईएमओ लगता है।
आप इसके लिए बिल्डरों का उपयोग कर सकते हैं या इटरेटर से एकत्र कर सकते हैं। इटरेटर से संग्रह करना अक्सर तेज़ होता है, लेकिन इस मामले में इसके लिए आपको 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 की अनुशंसा करता हूं। . इसमें ध्रुव और तीर का एकीकरण है और इसमें पागल प्रदर्शन है।