根据 Polars 中的条件选择列

pie*_*etz 2 python dataframe python-polars

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

df.select((pl.col(pl.Utf8)) & (pl.all().n_unique() < 100))
Run Code Online (Sandbox Code Playgroud)

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

df.select(pl.all().n_unique() < 100)
Run Code Online (Sandbox Code Playgroud)

这不会选择列,而是返回布尔值的单行 DataFrame。我想,我是极坐标新手,但仍然不能完全理解表达式 API。我究竟做错了什么?

jqu*_*ous 6

如果您提供一个示例以使其他人免于创建示例,将会很有帮助。

\n
df = pl.DataFrame({\n   "col1": ["A", "B", "C", "D"],\n   "col2": ["A", "A", "C", "A"],\n   "col3": ["A", "B", "A", "B"],\n   "col4": [1, 2, 3, 4],\n})\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
>>> df.select(pl.col(pl.Utf8))\nshape: (4, 3)\n\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82 col1 | col2 | col3 \xe2\x94\x82\n\xe2\x94\x82 ---  | ---  | ---  \xe2\x94\x82\n\xe2\x94\x82 str  | str  | str  \xe2\x94\x82\n\xe2\x95\x9e\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa1\n\xe2\x94\x82 A    | A    | A    \xe2\x94\x82\n\xe2\x94\x82 B    | A    | B    \xe2\x94\x82\n\xe2\x94\x82 C    | C    | A    \xe2\x94\x82\n\xe2\x94\x82 D    | A    | B    \xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
>>> df.select(pl.col(pl.Utf8).n_unique() < 3)\nshape: (1, 3)\n\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82 col1  | col2 | col3 \xe2\x94\x82\n\xe2\x94\x82 ---   | ---  | ---  \xe2\x94\x82\n\xe2\x94\x82 bool  | bool | bool \xe2\x94\x82\n\xe2\x95\x9e\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa1\n\xe2\x94\x82 false | true | true \xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n
Run Code Online (Sandbox Code Playgroud)\n

您可以循环此结果并提取.nametrue列的 。

\n

没有.is_true().all()等价。

\n
>>> [ col.name for col in df.select(pl.col(pl.Utf8).n_unique() < 3) if col.all() ]\n['col2', 'col3']\n
Run Code Online (Sandbox Code Playgroud)\n

然后您可以仅选择这些列:

\n
df.select(\n   col.name for col in \n   df.select(pl.col(pl.Utf8).n_unique() < 3) \n   if col.all()\n)\n
Run Code Online (Sandbox Code Playgroud)\n
shape: (4, 2)\n\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82 col2 | col3 \xe2\x94\x82\n\xe2\x94\x82 ---  | ---  \xe2\x94\x82\n\xe2\x94\x82 str  | str  \xe2\x94\x82\n\xe2\x95\x9e\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa1\n\xe2\x94\x82 A    | A    \xe2\x94\x82\n\xe2\x94\x82 A    | B    \xe2\x94\x82\n\xe2\x94\x82 C    | A    \xe2\x94\x82\n\xe2\x94\x82 A    | B    \xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n
Run Code Online (Sandbox Code Playgroud)\n

  • 我认为最接近这种类型的语法是 `df[:, df.select(pl.col(pl.Utf8).n_unique().lt(100)).melt().filter(pl.col("value "))["变量"]]` (2认同)