rust 以复杂的方式合并组合两极数据框架

bxgwgixi  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(75)

我有一个包含事务处理的框架和另一个包含分配给这些事务处理的员工的框架。每个事务处理可以有0.N个分配。我希望有一个框架,其中包含事务处理ID和单独列中的所有员工分配。请参阅下面的示例:
我有一个一个框架如下:
| TransactionIds|其他列(_O)..|
| --|--|
| T1| 2号牢房...这些都不重要|
| T2| 4号牢房...这些都不重要|
| T3| 4号牢房...这些都不重要|
我有另一个框架如下:
| TransactionIds|作业|
| --|--|
| T1|分配1|
| T1|分配2|
| T1|分配3|
| T2|分配3|
| T2|分配4|
| T3|分配6|
| T4| NULL|
我想有一个类似于以下的框架:
| TransactionIds|分配1|分配2|分配3| AssignmentN|
| --|--|--|--|--|
| T1|分配1|分配2|分配3| NULL|
| T2|分配3|分配4| NULL| NULL|
| T3| NULL| NULL| NULL| NULL|
我尝试了group by和agg()函数。然而,它给了我一个列表,我不知道如何转换为列。这种方法的另一个问题是我不知道要将这个列表转换为多少列。我想动态地确定/创建SELECT中的赋值列的数量。

7bsow1i6

7bsow1i61#

我可以通过以下方式解决这个问题:

let stns: Vec<String> = (1..6).map(|i| format!("Station {i}")).collect();
    let weather = df!(
            "station"=> &stns,
            "temperatures"=> &[
                "20 5 5 E1 7 13 19 9 6 20",
                "18 8 16 11 23 E2 8 E2 E2 E2 90 70 40",
                "19 24 E9 16 6 12 10 22",
                "E2 E0 15 7 8 10 E1 24 17 13 6",
                "14 8 E0 16 22 24 E1",
            ],
    )
    .unwrap();
    println!("{}", &weather);

    let out = weather
        .clone()
        .lazy()
        .with_columns([col("temperatures").str().split(lit(" "))])
        .with_column(col("temperatures").list().lengths().alias("counts"))
        .with_column(col("counts").max())
        .collect()
        .unwrap();

    println!("{}", &out);

    let max_is = out.column("counts").unwrap().u32().unwrap().max();

    println!("max_is: {:?}", max_is);

    let mut selects = vec![];

    for i in 0..max_is.unwrap() {
        selects.push(col("temperatures").list().get(lit(i)).alias(format!("Assignment_{}", i + 1).as_str()));
    }

    println!("Selects: {:#?}", selects);

    let out12 = out.lazy().with_columns(&selects).drop_columns(["foo"]).collect().unwrap();
    println!("{}", &out12);

字符串

相关问题