我正在try 学习一些关于使用极点的知识,所以我有一个简单的问题来测试它,我最终想在数据上运行group_by运算.

在分析数据时,我通过相加和累积的方法从初始数据创建了几个额外的序列.

我知道,当您想要将新创建的变量与表达式一起使用时,它需要在另一个链接的with_columns中,但我似乎无法使其工作.

我有以下示例代码,我认为它们应该是正确的,但失败了.代码如下:

import numpy as np
import polars as pl

data = np.random.random((50,5))
df = pl.from_numpy(data, schema=["id", "sampling_time", "area", "val1", "area_corr"])

(df
.with_columns([
    pl.col("id").cast(pl.Int32),
    pl.Series(name="total_area", values=df.select(pl.col("area") + pl.col("area_corr"))),
])
.with_columns([
    pl.Series(name="cumulative_area", values=df.select(pl.cum_sum("total_area")) / 0.15),
])
.with_columns([
    pl.Series(name="parcel_id", values=df.select(pl.col("cumulative_area").cast(pl.Int32))),
])
)

但是,代码段失败,并显示以下堆栈跟踪:

Traceback (most recent call last):
  File "C:\Users\xxx\anaconda3\envs\py38\lib\site-packages\IPython\core\interactiveshell.py", line 3508, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-8-8e61e84b3c85>", line 7, in <module>
    pl.Series(name="cumulative_area", values=df.select(pl.cum_sum("total_area")) / 0.15),
  File "C:\Users\xxx\anaconda3\envs\py38\lib\site-packages\polars\dataframe\frame.py", line 8142, in select
    return self.lazy().select(*exprs, **named_exprs).collect(_eager=True)
  File "C:\Users\xxx\anaconda3\envs\py38\lib\site-packages\polars\lazyframe\frame.py", line 1940, in collect
    return wrap_df(ldf.collect())
polars.exceptions.ColumnNotFoundError: total_area
Error originated just after this operation:
DF ["id", "sampling_time", "area", "val1"]; PROJECT */5 COLUMNS; SELECTION: "None"

我不明白为什么新创建的total_area系列找不到.

我在北极点0.20.7和巨 Python 3.8.18

推荐答案

Diagnostics.

您的代码失败,因为您在第二次调用pl.DataFrame.with_columns时显式引用了df.然而,先前with_columns求值的结果永远不会被重新赋值给变量df.尤其是,df不包含total_area列.

Solution.

通常,如果要添加到DataFrame的数据存储在外部变量中,而不是从DataFrame中的数据计算,则只能在with_columns内构造pl.Series个对象.

在您的示例中,创建新列所需的所有数据都已存在于数据中,您可以使用表达式API计算它们的值.

(
    df
    .with_columns(
        pl.col("id").cast(pl.Int32),
        total_area=pl.col("area") + pl.col("area_corr")
    )
    .with_columns(
        cumulative_area=pl.cum_sum("total_area") / 0.15
    )
    .with_columns(
        parcel_id=pl.col("cumulative_area").cast(pl.Int32)
    )
)

Python相关问答推荐

Pandas 第二小值有条件

删除所有列值,但判断是否存在任何二元组

如何过滤包含2个指定子字符串的收件箱列名?

将pandas Dataframe转换为3D numpy矩阵

OR—Tools中CP—SAT求解器的IntVar设置值

Django REST Framework:无法正确地将值注释到多对多模型,不断得到错误字段名称字段对模型无效'<><>

字符串合并语法在哪里记录

Django—cte给出:QuerySet对象没有属性with_cte''''

下三角形掩码与seaborn clustermap bug

Polars将相同的自定义函数应用于组中的多个列,

在Google Drive中获取特定文件夹内的FolderID和文件夹名称

polars:有效的方法来应用函数过滤列的字符串

在用于Python的Bokeh包中设置按钮的样式

将链中的矩阵乘法应用于多组值

如何在验证文本列表时使正则表达式无序?

仅使用预先计算的排序获取排序元素

裁剪数字.nd数组引发-ValueError:无法将空图像写入JPEG

每次查询的流通股数量

如何写一个polars birame到DuckDB

在聚合中使用python-polars时如何计算模式