如何在 python 极坐标中的两列上创建排名?

lmo*_*csi 3 python python-polars

假设我们在极坐标(python)中有这个数据框:

import polars as pl
df = pl.DataFrame(
    {   
        "era": ["01", "01", "02", "02", "03", "03"],
        "pred": [3,5,6,8,9,1]
    }
)
Run Code Online (Sandbox Code Playgroud)

我可以根据一列创建排名/行号,例如:

df.with_columns(rn = pl.col("era").rank("ordinal"))
Run Code Online (Sandbox Code Playgroud)

但如果我想基于两列来完成它,它就不起作用:

df.with_columns(rn = pl.col(["era","pred"]).rank("ordinal"))
Run Code Online (Sandbox Code Playgroud)

我收到此错误消息:

ComputeError: The name: 'rn' passed to `LazyFrame.with_columns` is duplicate
Error originated just after this operation:
DF ["era", "pred"]; PROJECT */2 COLUMNS; SELECTION: "None"
Run Code Online (Sandbox Code Playgroud)

关于如何执行此操作有什么建议吗?

jqu*_*ous 5

在一次pl.col调用中使用多个选择器:

\n
pl.col("one", "two").function()\n
Run Code Online (Sandbox Code Playgroud)\n

本质上是以下的简写:

\n
pl.col("one").function(), pl.col("two").function()\n
Run Code Online (Sandbox Code Playgroud)\n

您可以使用pl.struct将多个列“组合/分组”在一起:

\n
>>> df.with_columns(rn = pl.struct("era", "pred"))\nshape: (6, 3)\n\xe2\x94\x8c\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\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82 era \xe2\x94\x86 pred \xe2\x94\x86 rn        \xe2\x94\x82\n\xe2\x94\x82 --- \xe2\x94\x86 ---  \xe2\x94\x86 ---       \xe2\x94\x82\n\xe2\x94\x82 str \xe2\x94\x86 i64  \xe2\x94\x86 struct[2] \xe2\x94\x82\n\xe2\x95\x9e\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\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa1\n\xe2\x94\x82 01  \xe2\x94\x86 3    \xe2\x94\x86 {"01",3}  \xe2\x94\x82\n\xe2\x94\x82 01  \xe2\x94\x86 5    \xe2\x94\x86 {"01",5}  \xe2\x94\x82\n\xe2\x94\x82 02  \xe2\x94\x86 6    \xe2\x94\x86 {"02",6}  \xe2\x94\x82\n\xe2\x94\x82 02  \xe2\x94\x86 8    \xe2\x94\x86 {"02",8}  \xe2\x94\x82\n\xe2\x94\x82 03  \xe2\x94\x86 9    \xe2\x94\x86 {"03",9}  \xe2\x94\x82\n\xe2\x94\x82 03  \xe2\x94\x86 1    \xe2\x94\x86 {"03",1}  \xe2\x94\x82\n\xe2\x94\x94\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\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n
Run Code Online (Sandbox Code Playgroud)\n

然后你可以.rank

\n
>>> df.with_columns(rn = pl.struct("era", "pred").rank("ordinal"))\nshape: (6, 3)\n\xe2\x94\x8c\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\x90\n\xe2\x94\x82 era \xe2\x94\x86 pred \xe2\x94\x86 rn  \xe2\x94\x82\n\xe2\x94\x82 --- \xe2\x94\x86 ---  \xe2\x94\x86 --- \xe2\x94\x82\n\xe2\x94\x82 str \xe2\x94\x86 i64  \xe2\x94\x86 u32 \xe2\x94\x82\n\xe2\x95\x9e\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\xa1\n\xe2\x94\x82 01  \xe2\x94\x86 3    \xe2\x94\x86 1   \xe2\x94\x82\n\xe2\x94\x82 01  \xe2\x94\x86 5    \xe2\x94\x86 2   \xe2\x94\x82\n\xe2\x94\x82 02  \xe2\x94\x86 6    \xe2\x94\x86 3   \xe2\x94\x82\n\xe2\x94\x82 02  \xe2\x94\x86 8    \xe2\x94\x86 4   \xe2\x94\x82\n\xe2\x94\x82 03  \xe2\x94\x86 9    \xe2\x94\x86 6   \xe2\x94\x82\n\xe2\x94\x82 03  \xe2\x94\x86 1    \xe2\x94\x86 5   \xe2\x94\x82\n\xe2\x94\x94\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\x98\n
Run Code Online (Sandbox Code Playgroud)\n

  • 将其乘以-1。因此,不要使用 `pl.struct("era", "pred")` 而是执行 `pl.struct("era", pl.col("pred")*-1)` 如果基础列不是数字,那么您'首先进行排名,即 `pl.struct("era", pl.col("pred").rank()*-1)` (2认同)