rust - 使用Arrow/Datafusion/Polars(如python panda的groupby)按列值分区?

标签 rust apache-arrow

我正在寻找方便的 python panda 语法的等价物:

#df is a pandas dataframe

for fruit, sub_df in df.groupby('fruits'):
    # Do some stuff with sub_df and fruit
它基本上是一个 groupby,其中每个组都可以作为单个数据框与其标签(分组列中的公共(public)值)一起访问。
我查看了数据融合,但我无法重现此行为,而无需首先选择所有唯一值,然后执行一个选择 par 值,这会导致多次重新解析整个文件。
我看了看很有希望但也无法达到我的目标的 Polars crate 。
你将如何以与 python 代码相似/更好的性能来做到这一点?我对任何允许我通过固定列的值有效地对 Parquet 文件进行分区的语法/库/方法持开放态度。

这是一个 rust 示例代码,使用 polar 作为我正在处理的输入类型的示例:
    let s0 = Series::new("fruits", ["Apple", "Apple", "Pear", "Pear", "Pear", "Pear"].as_ref());
    let s1 = Series::new("maturity", ["A", "B", "A", "C", "A", "D"].as_ref());
    let s1 = Series::new("N", [1, 2, 2, 4, 2, 8].as_ref());
    // create a new DataFrame
    let df = DataFrame::new(vec![s0, s1, s2]).unwrap();

    // I would like to loop on all fruits values, each time with a dataframe containing only the records with this fruit.

最佳答案

您可以执行以下操作:

    let columns = df.columns();
    if let Ok(grouped) = df.groupby("fruits") {
        let sub_df = grouped.select(columns).agg_list()?;
        dbg!(sub_df);
    }
从技术上讲,这将为您留下一个数据框。那么问题是数据框的列是包含每个水果的所有值的数组,这可能不是您想要的。
+---------+--------------------------------------+-----------------------------+-----------------+
| fruits  | fruits_agg_list                      | maturity_agg_list           | N_agg_list      |
| ---     | ---                                  | ---                         | ---             |
| str     | list [str]                           | list [str]                  | list [i32]      |
+=========+======================================+=============================+=================+
| "Apple" | "[\"Apple\", \"Apple\"]"             | "[\"A\", \"B\"]"            | "[1, 2]"        |
+---------+--------------------------------------+-----------------------------+-----------------+
| "Pear"  | "[\"Pear\", \"Pear\", ... \"Pear\"]" | "[\"A\", \"C\", ... \"D\"]" | "[2, 4, ... 8]" |
+---------+--------------------------------------+-----------------------------+-----------------+

关于rust - 使用Arrow/Datafusion/Polars(如python panda的groupby)按列值分区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64325511/

相关文章:

rust - 在对迭代器进行分区时,未为Vec实现特征Extend

rust - Rust提示我正在编写的方法存在生命周期

visual-studio-code - 使用vscode调试rust程序时出现错误(仅限windows)

parquet - 写入 Delta 编码的 Parquet 文件

arrays - Rust 数组是否有等效于 JavaScript 的 indexOf ?

ruby - 是否可以直接从 Ruby 代码调用 Rust 的结构字段,而无需将 extern "C"getter 实现到相应的字段

generics - 如何避免传递类型依赖?

julia - 在 Julia 中使用 Arrow.jl 进行数据压缩

PyArrow 的时间戳数据问题

parquet - Apache 拼花和箭头之间的区别