python 根据Polars中的条件选择列

r7xajy2e  于 2023-02-15  发布在  Python
关注(0)|答案(2)|浏览(193)

我想根据条件选择Polars DataFrame中的列。在我的示例中,我想选择唯一值少于100个的所有字符串列。我天真地尝试了:

df.select((pl.col(pl.Utf8)) & (pl.all().n_unique() < 100))

这给了我一个错误,可能是由于表达式的第二部分。

df.select(pl.all().n_unique() < 100)

这不会选择列,而是返回一个bool值的单行DataFrame。我是polars的新手,我想我仍然不能完全理解表达式API。我做错了什么?

qlfbtfca

qlfbtfca1#

如果您包含一个示例,以使其他人不必创建一个示例,这将很有帮助。

df = pl.DataFrame({
   "col1": ["A", "B", "C", "D"],
   "col2": ["A", "A", "C", "A"],
   "col3": ["A", "B", "A", "B"],
   "col4": [1, 2, 3, 4],
})

您正在选择字符串列pl.col(pl.Utf8)

>>> df.select(pl.col(pl.Utf8))
shape: (4, 3)
┌──────┬──────┬──────┐
│ col1 | col2 | col3 │
│ ---  | ---  | ---  │
│ str  | str  | str  │
╞══════╪══════╪══════╡
│ A    | A    | A    │
│ B    | A    | B    │
│ C    | C    | A    │
│ D    | A    | B    │
└──────┴──────┴──────┘

您可以将.n_unique()链接到pl.col(),以便仅在这些列上运行它。

>>> df.select(pl.col(pl.Utf8).n_unique() < 3)
shape: (1, 3)
┌───────┬──────┬──────┐
│ col1  | col2 | col3 │
│ ---   | ---  | ---  │
│ bool  | bool | bool │
╞═══════╪══════╪══════╡
│ false | true | true │
└───────┴──────┴──────┘

您可以循环此结果,并为每个true列提取.name
没有.is_true(),但.all()是等效的。

>>> [ col.name for col in df.select(pl.col(pl.Utf8).n_unique() < 3) if col.all() ]
['col2', 'col3']

然后,您可以只选择这些列:

df.select(
   col.name for col in df.select(pl.col(pl.Utf8).n_unique() < 3) 
   if col.all())
shape: (4, 2)
┌──────┬──────┐
│ col2 | col3 │
│ ---  | ---  │
│ str  | str  │
╞══════╪══════╡
│ A    | A    │
│ A    | B    │
│ C    | A    │
│ A    | B    │
└──────┴──────┘
icnyk63a

icnyk63a2#

您可以通过执行melt后跟groupby来获取列的名称,但我不太确定如何将其转换为表达式

df = pl.DataFrame(
    {
        "val1": ["a", "b", "c"],
        "val2": ["d", "d", "d"],
    }
)
columns = (
    df.select(pl.col(pl.Utf8))
    .melt()
    .groupby("variable")
    .agg(pl.col("value").n_unique())
    .filter(pl.col("value") >= 3)
    .get_column("variable")
    .to_list()
)
df.select(columns)

相关问题