我正在参与一个数据挖掘项目,在进行特征工程时遇到了一些问题.我的目标之一是根据主键聚合数据,并生成新列.所以我写下:

df = df.group_by("case_id").agg(date_exprs(df,df_base))

def date_expr(df, df_base):
    # Join df and df_base on 'case_id' column
    df = df.join(df_base[['case_id','date_decision']], on="case_id", how="left")

    for col in df.columns:
        if col[-1] in ("D",):
            df = df.with_columns(pl.col(col) - pl.col("date_decision"))
            df = df.with_columns(pl.col(col).dt.total_days())

    cols = [col for col in df.columns if col[-1] in ("D",)]

    # Generate expressions for max, min, mean, mode, and std of date differences
    expr_max = [pl.max(col).alias(f"max_{col}") for col in cols]
    expr_min = [pl.min(col).alias(f"min_{col}") for col in cols]
    expr_mean = [pl.mean(col).alias(f"mean_{col}") for col in cols]
    expr_mode = [pl.mode(col).alias(f"mode_{col}") for col in cols]
    expr_std = [pl.std(col).alias(f"std_{col}") for col in cols]

    return expr_max + expr_min + expr_mean + expr_mode + expr_std

但是,出现了一个错误:AttributeError:模块‘polars’没有属性‘mode’.

我在GitHub上查找了Polar的文档,发现没有Dataframe.mode(),只有Series.mode(),我认为这可能是错误的原因?我提到了chat GPT,它无能为力,因为这些有错误的代码就是从它那里来的.

此外,这里只是一个处理浮点类型的示例.字符串类型呢?我也可以用你的方法吗?

我期待着您的好意帮助!

推荐答案

在您的示例中,它失败是因为没有像聚合函数那样的Expr.mode()的语法糖(例如,pl.max()Expr.max()的语法糖).mode()实际上不是聚合函数,而是计算函数,这意味着它只计算列中出现次数最多的值(S).

因此,假设DataFrame如下所示:

df = (
    pl.DataFrame({
        'aD' : [200, 200, 300, 400, 1, 3],
        'bD': [2, 3, 6, 4, 5, 1],
        'case_id': [1,1,1,2,2,2]
    })
)

┌─────┬─────┬─────────┐
│ aD  ┆ bD  ┆ case_id │
│ --- ┆ --- ┆ ---     │
│ i64 ┆ i64 ┆ i64     │
╞═════╪═════╪═════════╡
│ 200 ┆ 2   ┆ 1       │
│ 200 ┆ 3   ┆ 1       │
│ 300 ┆ 6   ┆ 1       │
│ 400 ┆ 4   ┆ 2       │
│ 1   ┆ 5   ┆ 2       │
│ 3   ┆ 1   ┆ 2       │
└─────┴─────┴─────────┘

您可以使用以下代码计算mode():

df.with_columns(
    pl.col('aD').mode(),
    pl.col('bD').mode()
)

┌─────┬─────┬─────────┐
│ aD  ┆ bD  ┆ case_id │
│ --- ┆ --- ┆ ---     │
│ i64 ┆ i64 ┆ i64     │
╞═════╪═════╪═════════╡
│ 200 ┆ 1   ┆ 1       │
│ 200 ┆ 5   ┆ 1       │
│ 200 ┆ 6   ┆ 1       │
│ 200 ┆ 4   ┆ 2       │
│ 200 ┆ 2   ┆ 2       │
│ 200 ┆ 3   ┆ 2       │
└─────┴─────┴─────────┘

鉴于此,我们仍然可以计算出您需要的结果.我将使用selectorsExpr.prefix()来简化您的函数:

import polars.selectors as cs

def date_expr():
    # Generate expressions for max, min, mean, mode, and std of date differences
    expr_max = cs.ends_with('D').max().name.prefix("max_")
    expr_min = cs.ends_with('D').min().name.prefix("min_")
    expr_mean = cs.ends_with('D').mean().name.prefix("mean_")
    expr_mode = cs.ends_with('D').mode().first().name.prefix("mode_")
    expr_std = cs.ends_with('D').std().name.prefix("std_")

    return expr_max, expr_min, expr_mean, expr_std, expr_mode

df.group_by("case_id").agg(date_expr())

┌─────────┬────────┬────────┬────────┬───┬────────────┬──────────┬─────────┬─────────┐
│ case_id ┆ max_aD ┆ max_bD ┆ min_aD ┆ … ┆ std_aD     ┆ std_bD   ┆ mode_aD ┆ mode_bD │
│ ---     ┆ ---    ┆ ---    ┆ ---    ┆   ┆ ---        ┆ ---      ┆ ---     ┆ ---     │
│ i64     ┆ i64    ┆ i64    ┆ i64    ┆   ┆ f64        ┆ f64      ┆ i64     ┆ i64     │
╞═════════╪════════╪════════╪════════╪═══╪════════════╪══════════╪═════════╪═════════╡
│ 2       ┆ 400    ┆ 5      ┆ 1      ┆ … ┆ 229.787583 ┆ 2.081666 ┆ 3       ┆ 4       │
│ 1       ┆ 300    ┆ 6      ┆ 200    ┆ … ┆ 57.735027  ┆ 2.081666 ┆ 200     ┆ 2       │
└─────────┴────────┴────────┴────────┴───┴────────────┴──────────┴─────────┴─────────┘

请注意,我对mode的一个值使用了Expr.first()--因为可能有不同的值具有相同的频率.您可以使用list个表达式来指定要获取的表达式.

Python相关问答推荐

将numpy数组存储在原始二进制文件中

根据在同一数据框中的查找向数据框添加值

未删除映射表的行

如何访问所有文件,例如环境变量

基于字符串匹配条件合并两个帧

如何在UserSerializer中添加显式字段?

以逻辑方式获取自己的pyproject.toml依赖项

如何按row_id/row_number过滤数据帧

将一个双框爆炸到另一个双框的范围内

GPT python SDK引入了大量开销/错误超时

计算机找不到已安装的库'

极点替换值大于组内另一个极点数据帧的最大值

利用SCIPY沿第一轴对数组进行内插

具有不匹配列的2D到3D广播

通过对列的其余部分进行采样,在Polars DataFrame中填充_null`?

如何在不不断遇到ChromeDriver版本错误的情况下使用Selify?

如何删除剪裁圆的对角线的外部部分

ValueError:必须在Pandas 中生成聚合值

如何批量训练样本大小为奇数的神经网络?

将参数从另一个python脚本中传递给main(argv