首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将两个DataFrames合并为不同的列/大小

如何将两个DataFrames合并为不同的列/大小
EN

Stack Overflow用户
提问于 2022-09-25 14:34:24
回答 2查看 102关注 0票数 0

寻找将两个DataFrames组合在一起的方法。

df1:

代码语言:javascript
复制
shape: (2, 2)
┌────────┬──────────────────────┐
│ Fruit  ┆ Phosphorus (mg/100g) │
│ ---    ┆ ---                  │
│ str    ┆ i32                  │
╞════════╪══════════════════════╡
│ Apple  ┆ 11                   │
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ Banana ┆ 22                   │
└────────┴──────────────────────┘

df2:

代码语言:javascript
复制
shape: (1, 3)
┌──────┬─────────────────────┬──────────────────────┐
│ Name ┆ Potassium (mg/100g) ┆ Phosphorus (mg/100g) │
│ ---  ┆ ---                 ┆ ---                  │
│ str  ┆ i32                 ┆ i32                  │
╞══════╪═════════════════════╪══════════════════════╡
│ Pear ┆ 115                 ┆ 12                   │
└──────┴─────────────────────┴──────────────────────┘

的结果应该是:

代码语言:javascript
复制
shape: (3, 3)
+--------+----------------------+---------------------+
| Fruit  | Phosphorus (mg/100g) | Potassium (mg/100g) |
| ---    | ---                  | ---                 |
| str    | i32                  | i32                 |
+========+======================+=====================+
| Apple  | 11                   | null                |
+--------+----------------------+---------------------+
| Banana | 22                   | null                |
+--------+----------------------+---------------------+
| Pear   | 12                   | 115                 |
+--------+----------------------+---------------------+

下面是我要做的代码片段:

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

fn main() {
    let df1: DataFrame = df!("Fruit" => &["Apple", "Banana"],
                         "Phosphorus (mg/100g)" => &[11, 22])
    .unwrap();

    let df2: DataFrame = df!("Name" => &["Pear"],
                            "Potassium (mg/100g)" => &[115],
                            "Phosphorus (mg/100g)" => &[12]
    )
    .unwrap();

    let df3: DataFrame = df1
        .join(&df2, ["Fruit"], ["Name"], JoinType::Left, None)
        .unwrap();

    assert_eq!(df3.shape(), (3, 3));
    println!("{}", df3);
}

我要找的是全外连接 .

我得到的错误:

线程'main‘惊慌于’断言失败:(left == right)左:(2, 4),右:(3, 3),src\main.rs:18:5

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-28 01:56:28

感谢@Ayaz :)我能够制作一个通用版本,在这个版本中,我不需要每次指定共享列名。

下面是两个DataFrames的完全外部连接的版本:

代码语言:javascript
复制
use polars::prelude::*;
use array_tool::vec::{Intersect};

fn concat_df(df1: &DataFrame, df2: &DataFrame) -> Result<DataFrame, PolarsError> {
    if df1.is_empty() {
        return Ok(df2.clone());
    }

    let df1_column_names = df1.get_column_names();
    let df2_column_names = df2.get_column_names();

    let common_column_names = &df1_column_names.intersect(df2_column_names)[..];

    df1.join(
        df2,
        common_column_names,
        common_column_names,
        JoinType::Outer,
        None,
    )
}
票数 0
EN

Stack Overflow用户

发布于 2022-09-26 02:20:00

您需要显式指定要合并的列,并将JoinType::Outer用于外部联接:

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

fn main() {
    let df1: DataFrame = df!("Fruit" => &["Apple", "Banana"],
                         "Phosphorus (mg/100g)" => &[11, 22])
    .unwrap();

    let df2: DataFrame = df!("Name" => &["Pear"],
                            "Potassium (mg/100g)" => &[115],
                            "Phosphorus (mg/100g)" => &[12]
    )
    .unwrap();

    let df3: DataFrame = df1
        .join(
            &df2,
            ["Fruit", "Phosphorus (mg/100g)"],
            ["Name", "Phosphorus (mg/100g)"],
            JoinType::Outer,
            None).unwrap();

    assert_eq!(df3.shape(), (3, 3));
    println!("{}", df3);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73845322

复制
相关文章

相似问题

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