按ID选择行并计算带 rust 极坐标中的平均值

ee7vknir  于 2022-11-24  发布在  其他
关注(0)|答案(2)|浏览(114)

我有下面的 Dataframe 和一个名称向量。
| 姓名|年龄|
| - -|- -|
| Pandas|五个|
| 北极熊|七个|
| 海马|一个|
我想根据向量中的名称选择行,并计算所选行的平均年龄。

let names = vec!["panda", "seahorse"];
let avg = df.lazy()
    .select([col("name").filter(|c| names.contains(c))])
    .agg([col("age").mean()]);

直觉告诉我们,传递一个函数给过滤器(就像我做的那样),然而这是错误的。显然有某种Expr API在起作用。它是如何工作的?我觉得文档有点令人费解。

w1jd8yoj

w1jd8yoj1#

如果使用特性is_in,则可以直接对另一个Expr中存在的列进行筛选,这将导致以下结果。
第一个

gtlvzcf8

gtlvzcf82#

我不确定是否有一种简单的方法可以按照您想要的方式进行筛选。您可以选择创建一个单独的DataFrame,其中包含您想要筛选的名称并执行联接:

let filter_df = df! [
    "name" => ["panda", "seahorse"]
].unwrap();

let avg = df.lazy()
    .join(filter_df.lazy(), [col("name")], [col("name")], JoinType::Inner)
    .select([col("age").mean()]);

不清楚您是否希望对从该过滤返回的所有年龄执行平均值计算(这是您的问题中的措辞),如果是这样的话,那么这段代码应该对您有效。

Ok(shape: (1, 1)
┌─────┐
│ age │
│ --- │
│ f64 │
╞═════╡
│ 3.0 │
└─────┘)

你的代码看起来像是在计算所有Pandas的均值和所有海马的均值,如果是这样的话,你可以使用.groupby().agg()链:

let avg = df.lazy()
    .join(names_df.lazy(), [col("name")], [col("name")], JoinType::Inner)
    .groupby([col("name")])
    .agg([col("age").mean()]);

其产生:

Ok(shape: (2, 2)
┌──────────┬─────┐
│ name     ┆ age │
│ ---      ┆ --- │
│ str      ┆ f64 │
╞══════════╪═════╡
│ seahorse ┆ 1.0 │
├╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┤
│ panda    ┆ 5.0 │
└──────────┴─────┘)

相关问题