代码之家  ›  专栏  ›  技术社区  ›  fishfin

Polars DataFrame-带整数的mul的十进制精度加倍

  •  3
  • fishfin  · 技术社区  · 1 年前

    我有一个Polars(v1.5.0)数据帧,有4列,如下例所示。当我将十进制列与整数列相乘时,得到的十进制列的小数位数加倍。

    from decimal import Decimal
    import polars as pl
    
    df = pl.DataFrame({
        "a": [1, 2],
        "b": [Decimal('3.45'), Decimal('4.73')],
        "c": [Decimal('2.113'), Decimal('4.213')],
        "d": [Decimal('1.10'), Decimal('3.01')]
    })
    
    shape: (2, 4)
    ┌─────┬──────────────┬──────────────┬──────────────┐
    │ a   ┆ b            ┆ c            ┆ d            │
    │ --- ┆ ---          ┆ ---          ┆ ---          │
    │ i64 ┆ decimal[*,2] ┆ decimal[*,3] ┆ decimal[*,2] │
    ╞═════╪══════════════╪══════════════╪══════════════╡
    │ 1   ┆ 3.45         ┆ 2.113        ┆ 1.10         │
    │ 2   ┆ 4.73         ┆ 4.213        ┆ 3.01         │
    └─────┴──────────────┴──────────────┴──────────────┘
    
    df.with_columns(pl.col("c", "d").mul(pl.col("a")))
    
    shape: (2, 4)
    ┌─────┬──────────────┬──────────────┬──────────────┐
    │ a   ┆ b            ┆ c            ┆ d            │
    │ --- ┆ ---          ┆ ---          ┆ ---          │
    │ i64 ┆ decimal[*,2] ┆ decimal[*,6] ┆ decimal[*,4] │
    ╞═════╪══════════════╪══════════════╪══════════════╡
    │ 1   ┆ 3.45         ┆ 2.113000     ┆ 1.1000       │
    │ 2   ┆ 4.73         ┆ 8.426000     ┆ 6.0200       │
    └─────┴──────────────┴──────────────┴──────────────┘
    

    当我只是将小数与整数相乘时,我不知道为什么刻度会加倍。我该怎么做才能不改变比例?

    2 回复  |  直到 1 年前
        1
  •  2
  •   mozway    1 年前

    这个 规模 确实似乎翻了一番。你可以 cast 返回到原始dtype:

    cols = ['c', 'd', 'e']
    df.with_columns(pl.col(c).mul(pl.col('a')).cast(df[c].dtype) for c in cols)
    

    请注意,目前似乎没有方法在 Expr ,但这是一个 discussed feature .

    例子:

    ┌─────┬─────┬──────────────┬──────────────┬──────────────┐
    │ a   ┆ b   ┆ c            ┆ d            ┆ e            │
    │ --- ┆ --- ┆ ---          ┆ ---          ┆ ---          │
    │ i64 ┆ i64 ┆ decimal[*,2] ┆ decimal[*,3] ┆ decimal[*,4] │
    ╞═════╪═════╪══════════════╪══════════════╪══════════════╡
    │ 1   ┆ 3   ┆ 2.11         ┆ 1.100        ┆ 1.1001       │
    │ 2   ┆ 4   ┆ 8.42         ┆ 6.022        ┆ 6.0004       │
    └─────┴─────┴──────────────┴──────────────┴──────────────┘
    

    已使用的输入:

    from decimal import Decimal
    df = pl.DataFrame({
        "a": [1, 2],
        "b": [3, 4],
        "c": [Decimal('2.11'), Decimal('4.21')],
        "d": [Decimal('1.10'), Decimal('3.011')],
        "e": [Decimal('1.1001'), Decimal('3.0002')],
    })
    
        2
  •  2
  •   Hericks    1 年前

    直到这个问题得到解决 pl.Expr.mul 对于小数的定义,您可以按如下方式转换回所需的小数位数。不过,乘法本身的精度更高。

    df.with_columns(
        pl.col(col).mul(pl.col("a")).cast(df.schema[col])
        for col in ["c", "d"]
    )
    
    shape: (2, 4)
    ┌─────┬──────────────┬──────────────┬──────────────┐
    │ a   ┆ b            ┆ c            ┆ d            │
    │ --- ┆ ---          ┆ ---          ┆ ---          │
    │ i64 ┆ decimal[*,2] ┆ decimal[*,3] ┆ decimal[*,2] │
    ╞═════╪══════════════╪══════════════╪══════════════╡
    │ 1   ┆ 3.45         ┆ 2.113        ┆ 1.10         │
    │ 2   ┆ 4.73         ┆ 8.426        ┆ 6.02         │
    └─────┴──────────────┴──────────────┴──────────────┘
    
    推荐文章