2

我正在使用极坐标,我想在加载数据框时定义列的类型。在熊猫中,我可以使用dtype

df=pd.read_csv("iris.csv", dtype={'petal_length':str})

我正在尝试在极地做同样的事情,但直到现在都没有成功。这是我尝试过的:

use polars::prelude::*;
use std::fs::File;
use std::collections::HashMap;


fn main() {
    let df = example();
    println!("{:?}", df.expect("Cannot find dataframe").head(Some(10)))
}

fn example() -> Result<DataFrame> {
    let file = File::open("iris.csv")
                    .expect("could not read file");
    let mut myschema = HashMap::new();
    myschema.insert("sepal_length", f64);
    myschema.insert("sepal_width", f64); 
    myschema.insert("petal_length",String); 
    myschema.insert("petal_width", f64); 
    myschema.insert("species", String); 

    CsvReader::new(file)
            .with_schema(myschema)
            .has_header(true)
            .finish()
}

我的疑问是实现with_schema期望的数据类型是什么?我打印了使用加载的 DataFrame 的架构infer_schema(None)。这打印了一个看起来像字典的对象:

Schema { fields: [Field { name: "sepal_length", data_type: Float64 }, Field { name: "sepal_width", data_type: Float64 }, Field { name: "petal_length", data_type: Float64 }, Field { name: "petal_width", data_type: Float64 }, Field { name: "species", data_type: Utf8 }] }

但我不知道应该使用什么对象来实现我的模式。

另外,有一种方法可以指定一个变量的类型,而不是全部?

4

1 回答 1

1

with_schema方法需要一个Arc<Schema>类型,而不是一个Hashmap.

以下代码有效:

use polars::prelude::*;
use std::sync::Arc;

fn example() -> Result<DataFrame> {
    let file = "iris.csv";

    let myschema = Schema::new(
        vec![
            Field::new("sepal_length", DataType::Float64),
            Field::new("sepal_width", DataType::Float64),
            Field::new("petal_length", DataType::Utf8),
            Field::new("petal_width", DataType::Float64),
            Field::new("species", DataType::Utf8),
        ]
    );

    CsvReader::from_path(file)?
        .with_schema(Arc::new(myschema))
        .has_header(true)
        .finish()
}

请注意,通常建议使用它来CsvReader::from_path代替,CsvReader::new因为它的性能要高得多。

另外,有一种方法可以指定一个变量的类型,而不是全部?

是的,您可以使用with_dtype_overwrite. 它需要一个部分模式。

于 2021-04-17T07:19:05.783 回答