rust 如何获得到Polars Dataframe 中先前出现的值的距离?

t98cgbkg  于 2023-01-17  发布在  其他
关注(0)|答案(1)|浏览(151)

我想高效地计算当前行到前一行的距离,我知道极坐标没有索引,但公式大致如下:

if prior_occurrence {
  (current_row_index - prior_occurrence_index - 1)
} else {
  -1
}

这是输入 Dataframe :

let df_a = df![
    "a" => [1, 2, 2, 1, 4, 1],
    "b" => ["c","a", "b", "c", "c","a"]
].unwrap();

println!("{}", df_a);

| a-i32|B -应力|
| - ------|- ------|
| 1个|(c)秘书长的报告|
| 第二章|项目a|
| 第二章|B|
| 1个|(c)秘书长的报告|
| 四个|(c)秘书长的报告|
| 1个|项目a|
所需输出:
| a-i32|B -应力|B_距离- i32|
| - ------|- ------|- ------|
| 1个|(c)秘书长的报告|-1人|
| 第二章|项目a|-1人|
| 第二章|B|-1人|
| 1个|(c)秘书长的报告|第二章|
| 四个|(c)秘书长的报告|无|
| 1个|项目a|三个|
最有效的方法是什么?

ttcibm8c

ttcibm8c1#

Python

(df
 .with_row_count("idx")
 .with_columns([
      ((pl.col("idx") - pl.col("idx").shift()).cast(pl.Int32).fill_null(0) - 1)
      .over("a").alias("a_distance_to_a")
 ])
)

生 rust

fn func1() -> PolarsResult<()> {
    let df_a = df![
    "a" => [1, 2, 2, 1, 4, 1],
    "b" => ["c","a", "b", "c", "c","a"]
    ]?;

    let out = df_a
        .lazy()
        .with_row_count("idx", None)
        .with_columns([((col("idx") - col("idx").shift(1))
            .cast(DataType::Int32)
            .fill_null(0)
            - lit(1))
        .over("a")
        .alias("a_distance_to_a")])
        .collect()?;

    Ok(())

输出

shape: (6, 4)
┌─────┬─────┬─────┬─────────────────┐
│ idx ┆ a   ┆ b   ┆ a_distance_to_a │
│ --- ┆ --- ┆ --- ┆ ---             │
│ u32 ┆ i64 ┆ str ┆ i32             │
╞═════╪═════╪═════╪═════════════════╡
│ 0   ┆ 1   ┆ c   ┆ -1              │
│ 1   ┆ 2   ┆ a   ┆ -1              │
│ 2   ┆ 2   ┆ b   ┆ 0               │
│ 3   ┆ 1   ┆ c   ┆ 2               │
│ 4   ┆ 4   ┆ c   ┆ -1              │
│ 5   ┆ 1   ┆ a   ┆ 1               │
└─────┴─────┴─────┴─────────────────┘

相关问题