将Pandas的pivot_table功能转换为Polars的pivot函数。

3

我正在尝试将一些Python pandas转换为polars。我正在尝试将pandas的pivot_table函数转换为polars,但是卡住了。以下是可用的pandas代码。我似乎无法使用Polars pivot函数获得相同的行为。 Polars pivot函数强制使用列参数,并将列值用作标题,而不是使用列标签作为标题。 我想要与Pandas相同的输出结果,但是使用Polars。

df = pd.DataFrame({"obj" : ["ring", "shoe", "ring"], "price":["65", "42", "65"], "value":["53", "55", "54"], "date":["2022-02-07", "2022-01-07", "2022-03-07"]})

table = pd.pivot_table(df, values=['price','value','date'],index=['obj'], aggfunc={'price': pd.Series.nunique,'value':pd.Series.nunique,'date':pd.Series.nunique})

print(table)

输出如下:

        date    price     value  
obj  
ring    2       1         2  
shoe    1       1         1
1个回答

7

在 Polars 中,我们不会使用数据透视表来完成此任务。相反,我们会使用 groupbyagg 函数。使用您的数据,代码如下:

import polars as pl
df = pl.from_pandas(df)

df.groupby("obj").agg(pl.all().n_unique())

shape: (2, 4)
┌──────┬───────┬───────┬──────┐
│ obj  ┆ price ┆ value ┆ date │
│ ---  ┆ ---   ┆ ---   ┆ ---  │
│ str  ┆ u32   ┆ u32   ┆ u32  │
╞══════╪═══════╪═══════╪══════╡
│ ring ┆ 122    │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌┤
│ shoe ┆ 111    │
└──────┴───────┴───────┴──────┘

数据透视表与数据重组

在Polars中使用pivot函数的场景是将'长格式'的数据集汇总成'宽格式'的数据集。例如,我们可以使用melt函数将原始数据集转换为'长格式'。

df2 = df.melt(id_vars="obj", value_vars=["price", "date", "value"])
print(df2)

shape: (9, 3)
┌──────┬──────────┬────────────┐
│ obj  ┆ variable ┆ value      │
│ ---  ┆ ---      ┆ ---        │
│ strstrstr        │
╞══════╪══════════╪════════════╡
│ ring ┆ price    ┆ 65         │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ shoe ┆ price    ┆ 42         │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ ring ┆ price    ┆ 65         │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ ring ┆ date     ┆ 2022-02-07 │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ shoe ┆ date     ┆ 2022-01-07 │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ ring ┆ date     ┆ 2022-03-07 │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ ring ┆ value    ┆ 53         │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ shoe ┆ value    ┆ 55         │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ ring ┆ value    ┆ 54         │
└──────┴──────────┴────────────┘

现在让我们使用 pivot 将这个“长格式”数据集汇总为一个“宽格式”数据集,并简单计算数值的数量。
df2.pivot(values='value', index='obj', columns='variable', aggregate_fn='count')

shape: (2, 4)
┌──────┬──────┬───────┬───────┐
│ obj  ┆ date ┆ price ┆ value │
│ ---  ┆ ---  ┆ ---   ┆ ---   │
│ str  ┆ u32  ┆ u32   ┆ u32   │
╞══════╪══════╪═══════╪═══════╡
│ ring ┆ 222     │
├╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┤
│ shoe ┆ 111     │
└──────┴──────┴───────┴───────┘

这有助于澄清pivot功能的使用吗?


是的,非常棒的回答,非常感谢!你似乎对 Polars 很有了解。你有任何可以帮助处理类似情况的资源吗?到目前为止我一直在使用他们的 git 参考文献。 - Butter_
2
一个早期帮助我的资源是“Cookbook”。https://pola-rs.github.io/polars-book/user-guide/现在我经常浏览API文档:https://pola-rs.github.io/polars/py-polars/html/reference/index.html和Stack Overflow的问题,以便我可以学到一些巧妙的技巧和提示。 - user18559875

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接