DataFrameは、表っぽいデータを扱う構造体。
use polars::{
error::PolarsError,
frame::DataFrame,
prelude::NamedFrom,
series::Series,
};
fn create_data_frame() -> Result<DataFrame, PolarsError> {
let array1 = [1, 2, 3, 4];
let array2 = [11_i64, 22_i64, 33_i64, 44_i64];
let array3 = ["aaa", "bbb", "ccc", "ddd"];
let series1 = Series::new("foo".into(), array1);
let series2 = Series::new("bar".into(), array2);
let series3 = Series::new("zzz".into(), array3);
let columns = vec![series1, series2, series3];
let df = DataFrame::new(columns)?;
Ok(df)
}
DataFrameはVec<Series>を渡して生成する。
Seriesのnew()を呼ぶ為にはNamedFromもインポート(use)しておく必要がある。
Series::new()の第1引数(カラム名)の型はPlSmallStrなので、&strから変換する為にinto()を呼んでいる。
nullを扱いたい場合は、渡すデータをOptionにする。
let array2 = [Some(11_i64), Some(22_i64), None, Some(44_i64)];
渡すデータにはVecを使うことも出来る。
let mut vec1 = Vec::new(); // Vec<i32>
let mut vec2 = Vec::new(); // Vec<Option<i64>>
let mut vec3 = Vec::new(); // Vec<&str>
for (foo, bar, zzz) in [(1, 11, "aaa"), (2, 22, "bbb"), (3, -1, "ccc")] {
vec1.push(foo);
if bar >= 0 {
vec2.push(Some(bar as i64));
} else {
vec2.push(None);
}
vec3.push(zzz);
}
let series1 = Series::new("foo".into(), vec1);
let series2 = Series::new("bar".into(), vec2);
let series3 = Series::new("zzz".into(), vec3);
let columns = vec![series1, series2, series3];
let df = DataFrame::new(columns)?;