python 在Polars中创建一个常量列

quhf5bfb  于 2024-01-05  发布在  Python
关注(0)|答案(3)|浏览(242)

在Polars 0.13.14中,我可以创建一个DataFrame,其中包含一个全常数列,如下所示:

  1. import polars as pl
  2. pl.DataFrame(dict(x=pl.repeat(1, 3)))
  3. # shape: (3, 1)
  4. # ┌─────┐
  5. # │ x │
  6. # │ --- │
  7. # │ i64 │
  8. # ╞═════╡
  9. # │ 1 │
  10. # ├╌╌╌╌╌┤
  11. # │ 1 │
  12. # ├╌╌╌╌╌┤
  13. # │ 1 │
  14. # └─────┘

字符串
但在Polars 0.13.15中,这是一个错误

  1. ValueError: Series constructor not called properly.


如何用polars中的值填充列?

smdnsysy

smdnsysy1#

您可能正在寻找pl.lit(..)

  1. import polars as pl
  2. df = pl.DataFrame({"a": [1,2,3], "b": [4, 5, 6]})
  3. print(df)
  4. print(df.with_column(pl.lit(1).alias("constant_column")))

字符串
这将为您给予以下输出

  1. shape: (3, 2)
  2. ┌─────┬─────┐
  3. a b
  4. --- ---
  5. i64 i64
  6. ╞═════╪═════╡
  7. 1 4
  8. ├╌╌╌╌╌┼╌╌╌╌╌┤
  9. 2 5
  10. ├╌╌╌╌╌┼╌╌╌╌╌┤
  11. 3 6
  12. └─────┴─────┘
  13. shape: (3, 3)
  14. ┌─────┬─────┬─────────────────┐
  15. a b constant_column
  16. --- --- ---
  17. i64 i64 i32
  18. ╞═════╪═════╪═════════════════╡
  19. 1 4 1
  20. ├╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
  21. 2 5 1
  22. ├╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
  23. 3 6 1
  24. └─────┴─────┴─────────────────┘

展开查看全部
vc6uscn9

vc6uscn92#

从Polars 0.13.15开始,默认情况下,repeat became a lazy function和lazy函数不会在DataFrame构造函数中进行计算。您可以使用eager=True标志恢复渴望行为:

  1. import polars as pl
  2. pl.DataFrame(dict(x=pl.repeat(1, 3, eager=True)))

字符串
或者你可以使用这样的上下文:

  1. import polars as pl
  2. pl.DataFrame().with_column(pl.repeat(1, 3).alias('x'))

xyhw6mcr

xyhw6mcr3#

pl.repeat(polars v0.20.0)的文档字符串如下:

  1. pl.repeat(
  2. value: 'IntoExpr | None',
  3. n: 'int | Expr',
  4. *,
  5. dtype: 'PolarsDataType | None' = None,
  6. eager: 'bool' = False,
  7. ) -> 'Expr | Series'

字符串
默认情况下,它返回一个惰性表达式。

  1. pl.repeat(1,2, eager=True)


正如@ Drupal所提到的。
表达式也可以使用pl.select运行,并转换为系列:

  1. In[265]: pl.select(pl.repeat(1, 2)).to_series()
  2. Out[265]:
  3. shape: (2,)
  4. Series: 'repeat' [i32]
  5. [
  6. 1
  7. 1
  8. ]


pl.select并行运行表达式,因此您可以简化并加快该过程,

  1. pl.DataFrame(pl.select(a=pl.repeat(1, 100), b=pl.repeat(1, 100)).to_dict())


当你有很多表达式计算时,这可能很方便。为了演示它:

  1. In [277]: %timeit pl.select(a=pl.repeat(1, 100, eager=True))
  2. 150 µs ± 6.2 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
  3. In [278]: %timeit pl.select(a=pl.repeat(1, 100, eager=True), b=pl.repeat(1, 100, eager=True))
  4. 331 µs ± 14.1 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
  5. In [279]: %timeit pl.select(a=pl.repeat(1, 100), b=pl.repeat(1, 100))
  6. 128 µs ± 4.18 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
  7. In [280]: %timeit pl.select(a=pl.repeat(1, 100))
  8. 104 µs ± 8.09 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
  9. In [281]: %timeit pl.repeat(1, 100, eager=True)
  10. 99 µs ± 5.18 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
  11. In [282]: %timeit pl.repeat(1, 100, eager=True); pl.repeat(1, 100, eager=True)
  12. 208 µs ± 14.4 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

展开查看全部

相关问题