寻找将两个DataFrames组合在一起的方法。
df1:
shape: (2, 2)
┌────────┬──────────────────────┐
│ Fruit ┆ Phosphorus (mg/100g) │
│ --- ┆ --- │
│ str ┆ i32 │
╞════════╪══════════════════════╡
│ Apple ┆ 11 │
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ Banana ┆ 22 │
└────────┴──────────────────────┘df2:
shape: (1, 3)
┌──────┬─────────────────────┬──────────────────────┐
│ Name ┆ Potassium (mg/100g) ┆ Phosphorus (mg/100g) │
│ --- ┆ --- ┆ --- │
│ str ┆ i32 ┆ i32 │
╞══════╪═════════════════════╪══════════════════════╡
│ Pear ┆ 115 ┆ 12 │
└──────┴─────────────────────┴──────────────────────┘的结果应该是:
shape: (3, 3)
+--------+----------------------+---------------------+
| Fruit | Phosphorus (mg/100g) | Potassium (mg/100g) |
| --- | --- | --- |
| str | i32 | i32 |
+========+======================+=====================+
| Apple | 11 | null |
+--------+----------------------+---------------------+
| Banana | 22 | null |
+--------+----------------------+---------------------+
| Pear | 12 | 115 |
+--------+----------------------+---------------------+下面是我要做的代码片段:
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
发布于 2022-09-28 01:56:28
感谢@Ayaz :)我能够制作一个通用版本,在这个版本中,我不需要每次指定共享列名。
下面是两个DataFrames的完全外部连接的版本:
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,
)
}发布于 2022-09-26 02:20:00
您需要显式指定要合并的列,并将JoinType::Outer用于外部联接:
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);
}https://stackoverflow.com/questions/73845322
复制相似问题