首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何取几个列的正中位?

我如何取几个列的正中位?
EN

Stack Overflow用户
提问于 2022-11-30 17:16:47
回答 1查看 26关注 0票数 0

假设我有一个由以下四个DataFrame组成的Series

代码语言:javascript
复制
use polars::prelude::*;
use chrono::prelude::*;
use chrono::Duration;

fn main() {

    let series_one = Series::new(
        "a",
        (0..4).into_iter().map(|v| v as f64).collect::<Vec<_>>(),
    );
    let series_two = Series::new(
        "a",
        (4..8).into_iter().map(|v| v as f64).collect::<Vec<_>>(),
    );
    let series_three = Series::new(
        "a",
        (8..12).into_iter().map(|v| v as f64).collect::<Vec<_>>(),
    );

    let series_dates = Series::new(
        "date",
        (0..4)
            .into_iter()
            .map(|v| NaiveDate::default() + Duration::days(v))
            .collect::<Vec<_>>(),
    );

我也是这样加入的:

代码语言:javascript
复制
    let df_one = DataFrame::new(vec![series_one, series_dates.clone()]).unwrap();
    let df_two = DataFrame::new(vec![series_two, series_dates.clone()]).unwrap();
    let df_three = DataFrame::new(vec![series_three, series_dates.clone()]).unwrap();
    let df = df_one
        .join(
            &df_two,
            ["date"],
            ["date"],
            JoinType::Outer,
            Some("1".into()),
        )
        .unwrap()
        .join(
            &df_three,
            ["date"],
            ["date"],
            JoinType::Outer,
            Some("2".into()),
        )
        .unwrap();

生成以下DataFrame

代码语言:javascript
复制
shape: (4, 4)
┌─────┬────────────┬─────┬──────┐
│ a   ┆ date       ┆ a1  ┆ a2   │
│ --- ┆ ---        ┆ --- ┆ ---  │
│ f64 ┆ date       ┆ f64 ┆ f64  │
╞═════╪════════════╪═════╪══════╡
│ 0.0 ┆ 1970-01-01 ┆ 4.0 ┆ 8.0  │
├╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┤
│ 1.0 ┆ 1970-01-02 ┆ 5.0 ┆ 9.0  │
├╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┤
│ 2.0 ┆ 1970-01-03 ┆ 6.0 ┆ 10.0 │
├╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┤
│ 3.0 ┆ 1970-01-04 ┆ 7.0 ┆ 11.0 │
└─────┴────────────┴─────┴──────┘

如何创建一个新的DataFrame,其中包含一个date列和一个类似的a_median列?:

代码语言:javascript
复制
┌────────────┬────────────┐
│ a_median   ┆ date       ┆
│ ---        ┆ ---        ┆
│ f64        ┆ date       ┆
╞════════════╪════════════╡
│ 4.0        ┆ 1970-01-01 ┆
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 5.0        ┆ 1970-01-02 ┆
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 6.0        ┆ 1970-01-03 ┆
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 7.0        ┆ 1970-01-04 ┆
└────────────┴────────────┘

我认为最好通过LazyFrame来实现这一点,但我不知道如何得到准确的结果。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-30 18:20:13

要获得所需的结果,可以使用v堆栈方法将三个DataFrames联合起来:

代码语言:javascript
复制
let mut unioned = df_one.vstack(&df_two).unwrap();
unioned = unioned.vstack(&df_three).unwrap();

一旦有了包含所有记录的单个DataFrame,就可以对它们进行分组和聚合:

代码语言:javascript
复制
let aggregated = unioned.lazy()
                        .groupby(["date"])
                        .agg([
                            col("a").median().alias("a_median")
                         ])
                         .sort(
                            "date", 
                            SortOptions {
                                descending: false, 
                                nulls_last: true
                            }
                         )
                         .collect()
                         .unwrap();

它提供了预期的结果:

代码语言:javascript
复制
    ┌────────────┬──────────┐
    │ date       ┆ a_median │
    │ ---        ┆ ---      │
    │ date       ┆ f64      │
    ╞════════════╪══════════╡
    │ 1970-01-01 ┆ 4.0      │
    ├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┤
    │ 1970-01-02 ┆ 5.0      │
    ├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┤
    │ 1970-01-03 ┆ 6.0      │
    ├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┤
    │ 1970-01-04 ┆ 7.0      │
    └────────────┴──────────┘
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74631720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档