在下面的代码中,我创建了一个具有相同数据的极坐标和熊猫数据框。我想根据第
A
列的条件选择一组行,然后更新第 C
列的相应行。我已经介绍了如何使用 pandas 数据框执行此操作,但我不知道如何使用 Polars 进行此操作。我得到的最接近的是使用 when-then-otherwise
,但除了 then
中的单个值之外,我无法使用任何其他值。
import pandas as pd
import polars as pl
df_pd = pd.DataFrame({'A': ['x', 'x', 'x', 'x', 'y', 'y', 'y', 'y'],
'B': [1, 1, 2, 2, 1, 1, 2, 2],
'C': [1, 2, 3, 4, 5, 6, 7, 8]})
df_pl = pl.DataFrame({'A': ['x', 'x', 'x', 'x', 'y', 'y', 'y', 'y'],
'B': [1, 1, 2, 2, 1, 1, 2, 2],
'C': [1, 2, 3, 4, 5, 6, 7, 8]})
df_pd.loc[df_pd['A'] == 'x', 'C'] = [-1, -2, -3, -4]
df_pl ???
在 Polars 中,并没有真正分配给 DataFrame 切片的概念。
此外,在何时/那么/否则,Polars 期望所有东西的长度都是兼容的。它们的长度必须相同,或者是然后广播的标量。
考虑到这些事情,这里有一些选择:
假设您知道 A 列中有 4 个值“x”,您可以拆分 df,更新列并将结果连接在一起。 无论 4 个“x”值位于哪一行,这都有效。
pl.concat([
df_pl.filter(pl.col("A") == "x").with_columns(C=pl.Series([-1, -2, -3, -4])),
df_pl.filter(pl.col("A") != "x"),
])
如果您还知道“x”行是前 4 行,则可以用空值填充新值,然后使用 when/then/otherwise 或合并。这仅当你知道它们是前 4 行时才有效。
new_values = [-1, -2, -3, -4]
new_c = pl.Series(new_values).extend_constant(None, df_pl.height - len(new_values))
df_pl.with_columns(C=pl.coalesce(new_c, "C"))
在您的示例数据上,上述两个片段都输出
shape: (8, 3)
┌─────┬─────┬─────┐
│ A ┆ B ┆ C │
│ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 │
╞═════╪═════╪═════╡
│ x ┆ 1 ┆ -1 │
│ x ┆ 1 ┆ -2 │
│ x ┆ 2 ┆ -3 │
│ x ┆ 2 ┆ -4 │
│ y ┆ 1 ┆ 5 │
│ y ┆ 1 ┆ 6 │
│ y ┆ 2 ┆ 7 │
│ y ┆ 2 ┆ 8 │
└─────┴─────┴─────┘
请阅读此答案的其他人注意,如果您只需要分配一个标量(文字值)或有一个与 DataFrame 长度相同的新列表,只需使用普通的when/then/otherwise,如here中所述用户指南和文档中的here,而不是上面的建议。