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)?;