将列切片设置为极坐标数据帧上的值列表

问题描述 投票:0回答:1

在下面的代码中,我创建了一个具有相同数据的极坐标和熊猫数据框。我想根据第

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 ???

python python-polars
1个回答
0
投票

在 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,而不是上面的建议。

© www.soinside.com 2019 - 2024. All rights reserved.