python 如何使用polars cut方法将结果返回到原始df

bogh5gae  于 2023-04-04  发布在  Python
关注(0)|答案(2)|浏览(144)

如何在选择上下文中使用它,例如df.with_columns?
更具体地说,如果我有一个包含很多列的polars Dataframe ,其中一个列被称为x,我如何在x上执行pl.cut并将分组结果追加到原始 Dataframe 中?
下面是我尝试过的,但它不起作用:

df = pl.DataFrame({"a": [1, 2, 3, 4, 5], "b": [2, 3, 4, 5, 6], "x": [1, 3, 5, 7, 9]}
df.with_columns(pl.cut(pl.col("x"), bins=[2, 4, 6]))

非常感谢你的帮助。

iqjalb3h

iqjalb3h1#

从文档来看,从2023-01-25开始,cut接受一个Series并返回一个DataFrame。与许多/大多数方法和函数不同,它不接受表达式,所以你不能在selectwith_column(s)中使用它。要得到你想要的结果,你必须将它连接到你原来的df。
另外,cut似乎不需要维护与父系列相同的数据类型。(这肯定是一个bug)因此,在本例中,您必须将其强制转换为int。
你会:

df=df.join(
    pl.cut(df.get_column('x'),bins=[2,4,6]).with_column(pl.col('x').cast(pl.Int64())),
    on='x'
)

shape: (5, 5)
┌─────┬─────┬─────┬─────────────┬─────────────┐
│ a   ┆ b   ┆ x   ┆ break_point ┆ category    │
│ --- ┆ --- ┆ --- ┆ ---         ┆ ---         │
│ i64 ┆ i64 ┆ i64 ┆ f64         ┆ cat         │
╞═════╪═════╪═════╪═════════════╪═════════════╡
│ 1   ┆ 2   ┆ 1   ┆ 2.0         ┆ (-inf, 2.0] │
│ 2   ┆ 3   ┆ 3   ┆ 4.0         ┆ (2.0, 4.0]  │
│ 3   ┆ 4   ┆ 5   ┆ 6.0         ┆ (4.0, 6.0]  │
│ 4   ┆ 5   ┆ 7   ┆ inf         ┆ (6.0, inf]  │
│ 5   ┆ 6   ┆ 9   ┆ inf         ┆ (6.0, inf]  │
└─────┴─────┴─────┴─────────────┴─────────────┘
avkwfej4

avkwfej42#

0.16.8开始,顶级函数pl.cut已被弃用。现在必须使用series方法.cut,该方法返回三列DataFrame。

df = pl.DataFrame(
    {"a": [1, 2, 3, 4, 5],
     "b": [2, 3, 4, 5, 6],
     "x": [1, 3, 5, 7, 9]}
)
# get x column as a Series and then apply .cut method
df['x'].cut(bins=[2, 4, 6])

它返回一个DataFrame,如下所示:

shape: (5, 3)
┌─────┬─────────────┬─────────────┐
│ x   ┆ break_point ┆ category    │
│ --- ┆ ---         ┆ ---         │
│ f64 ┆ f64         ┆ cat         │
╞═════╪═════════════╪═════════════╡
│ 1.0 ┆ 2.0         ┆ (-inf, 2.0] │
│ 3.0 ┆ 4.0         ┆ (2.0, 4.0]  │
│ 5.0 ┆ 6.0         ┆ (4.0, 6.0]  │
│ 7.0 ┆ inf         ┆ (6.0, inf]  │
│ 9.0 ┆ inf         ┆ (6.0, inf]  │
└─────┴─────────────┴─────────────┘

如果你只想在主DataFrame中添加cut categories,你可以直接在with_columns()中完成:
一个二个一个一个

相关问题