python - 将多列的不同值组合成 Polars 中的一列

我有以下带有 pandas 的 Python 代码

df['EVENT_DATE'] = df.apply(
        lambda row: datetime.date(year=row.iyear, month=row.imonth, day=row.iday).strftime("%Y-%m-%d"), axis=1)

并希望将其转换为有效的 Polars 代码。有没有人知道如何解决这个问题?

最佳答案

我还将回答您的一般问题,而不仅仅是您的特定用例。

对于您的具体情况,从 polars version >= 0.10.18 开始,推荐的创建所需内容的方法是使用 pl.date pl.datetime 表达式。

给定此数据框,pl.date 用于按要求格式化日期。

import polars as pl

df = pl.DataFrame({
    "iyear": [2001, 2001],
    "imonth": [1, 2],
    "iday": [1, 1]
})


df.with_columns([
    pl.date("iyear", "imonth", "iday").dt.strftime("%Y-%m-%d").alias("fmt")

])

这个输出:

shape: (2, 4)
┌───────┬────────┬──────┬────────────┐
│ iyear ┆ imonth ┆ iday ┆ fmt        │
│ ---   ┆ ---    ┆ ---  ┆ ---        │
│ i64   ┆ i64    ┆ i64  ┆ str        │
╞═══════╪════════╪══════╪════════════╡
│ 2001  ┆ 1      ┆ 1    ┆ 2001-01-01 │
├╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 2001  ┆ 2      ┆ 1    ┆ 2001-02-01 │
└───────┴────────┴──────┴────────────┘

在单个表达式中收集其他列的其他方法

下面是对主要问题的更通用的回答。我们可以使用 map 获取多个列作为 Series,或者如果我们知道我们想要格式化字符串列,我们可以使用 pl.formatmap 提供了大部分实用性。

df.with_columns([
    # string fmt over multiple expressions
    pl.format("{}-{}-{}", "iyear", "imonth", "iday").alias("date"),
    # columnar lambda over multiple expressions
    pl.map(["iyear", "imonth", "iday"], lambda s: s[0] + "-" + s[1] + "-" + s[2]).alias("date2"),
])

这输出

shape: (2, 5)
┌───────┬────────┬──────┬──────────┬──────────┐
│ iyear ┆ imonth ┆ iday ┆ date     ┆ date2    │
│ ---   ┆ ---    ┆ ---  ┆ ---      ┆ ---      │
│ i64   ┆ i64    ┆ i64  ┆ str      ┆ str      │
╞═══════╪════════╪══════╪══════════╪══════════╡
│ 2001  ┆ 1      ┆ 1    ┆ 2001-1-1 ┆ 2001-1-1 │
├╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┤
│ 2001  ┆ 2      ┆ 1    ┆ 2001-2-1 ┆ 2001-2-1 │
└───────┴────────┴──────┴──────────┴──────────┘

避免逐行操作

不过,接受的答案在结果中是正确的。这不是对极坐标中的多列应用操作的推荐方法。访问行非常慢。导致大量缓存未命中,需要运行缓慢的 Python 字节码并终止所有并行化/查询优化。

注意事项

在这种特定情况下,不建议使用创建字符串数据的 map :

pl.map(["iyear", "imonth", "iday"], lambda s: s[0] + "-"+ s[1] + "-"+ s[2])别名(“日期 2”),。因为内存的布局方式以及我们为每个字符串操作创建一个新列,这实际上非常昂贵(仅限字符串数据)。因此有 pl.formatpl.concat_str

https://stackoverflow.com/questions/69890056/

相关文章:

arrays - 为什么文本行数组看起来有一个额外的容器级别?

python - 如何在 python 中删除表的某些行?

javascript - 遍历对象数组并获得新的对象数组

android - 找不到实现(房间)

javascript - discord.js 禁用 “interaction failed”

list - 如何更新 Haskell 中的列表元素

c++ - 如何直接从输入流中向集合中插入值?

regex - 如何验证用户输入中的 Perl 正则表达式?

python - 如何使用 while 循环摆脱空字符串? (Python)

r - 如何编写一个 apply() 函数来将矩阵列中的每个元素限制为最大允许值?