在Polars版本0.20.7之前,如果为columns参数给定多个值,则pivot()方法将基于index列对columns individually中的每个列应用聚合逻辑,而不是对一组集合列应用聚合逻辑.

之前:

df = pl.DataFrame(
    {
        "foo": ["one", "one", "two", "two", "one", "two"],
        "bar": ["y", "y", "y", "x", "x", "x"],
        "biz": ['m', 'f', 'm', 'f', 'm', 'f'],
        "baz": [1, 2, 3, 4, 5, 6],
    }
)

df.pivot(index='foo', values='baz', columns=('bar', 'biz'), aggregate_function='sum')

退货:

shape: (2, 5)
┌─────┬─────┬─────┬─────┬─────┐
│ foo ┆ y   ┆ x   ┆ m   ┆ f   │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 ┆ i64 ┆ i64 │
╞═════╪═════╪═════╪═════╪═════╡
│ one ┆ 3   ┆ 5   ┆ 6   ┆ 2   │
│ two ┆ 3   ┆ 10  ┆ 3   ┆ 10  │
└─────┴─────┴─────┴─────┴─────┘

之后(单位:0.20.7):

shape: (2, 5)
┌─────┬───────────┬───────────┬───────────┬───────────┐
│ foo ┆ {"y","m"} ┆ {"y","f"} ┆ {"x","f"} ┆ {"x","m"} │
│ --- ┆ ---       ┆ ---       ┆ ---       ┆ ---       │
│ str ┆ i64       ┆ i64       ┆ i64       ┆ i64       │
╞═════╪═══════════╪═══════════╪═══════════╪═══════════╡
│ one ┆ 1         ┆ 2         ┆ null      ┆ 5         │
│ two ┆ 3         ┆ null      ┆ 10        ┆ null      │
└─────┴───────────┴───────────┴───────────┴───────────┘

我更喜欢以前的功能;处理新的透视表非常笨拙,特别是考虑到它的列名.Polars开发人员将这一更改放在"错误修复"下,但它实际上 destruct 了我的代码.

推荐答案

我认为有几种方法可以做到这一点:

首先,您可以先对DataFrame使用melt(),然后使用Pivot:

df.melt(["foo", "baz"])

─────┬─────┬──────────┬───────┐
│ foo ┆ baz ┆ variable ┆ value │
│ --- ┆ --- ┆ ---      ┆ ---   │
│ str ┆ i64 ┆ str      ┆ str   │
╞═════╪═════╪══════════╪═══════╡
│ one ┆ 1   ┆ bar      ┆ y     │
│ one ┆ 2   ┆ bar      ┆ y     │
│ two ┆ 3   ┆ bar      ┆ y     │
│ two ┆ 4   ┆ bar      ┆ x     │
│ one ┆ 5   ┆ bar      ┆ x     │
│ …   ┆ …   ┆ …        ┆ …     │
│ one ┆ 2   ┆ biz      ┆ f     │
│ two ┆ 3   ┆ biz      ┆ m     │
│ two ┆ 4   ┆ biz      ┆ f     │
│ one ┆ 5   ┆ biz      ┆ m     │
│ two ┆ 6   ┆ biz      ┆ f     │
└─────┴─────┴──────────┴───────┘

然后以相同的方式旋转:

(
   df
   .melt(["foo", "baz"])
   .pivot(index='foo', values='baz', columns='value', aggregate_function='sum')
)

┌─────┬─────┬─────┬─────┬─────┐
│ foo ┆ y   ┆ x   ┆ m   ┆ f   │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 ┆ i64 ┆ i64 │
╞═════╪═════╪═════╪═════╪═════╡
│ one ┆ 3   ┆ 5   ┆ 6   ┆ 2   │
│ two ┆ 3   ┆ 10  ┆ 3   ┆ 10  │
└─────┴─────┴─────┴─────┴─────┘

或者,如果需要聚合的列之间的可能值列表不相交,则可以使用concat(),how=align:

pl.concat(
    [df.pivot(index='foo', values='baz', columns=col, aggregate_function="sum") for col in ['bar','biz']],
    how='align'
)

┌─────┬─────┬─────┬─────┬─────┐
│ foo ┆ y   ┆ x   ┆ m   ┆ f   │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 ┆ i64 ┆ i64 │
╞═════╪═════╪═════╪═════╪═════╡
│ one ┆ 3   ┆ 5   ┆ 6   ┆ 2   │
│ two ┆ 3   ┆ 10  ┆ 3   ┆ 10  │
└─────┴─────┴─────┴─────┴─────┘

Python相关问答推荐

如何在msgraph.GraphServiceClient上进行身份验证?

如果条件为真,则Groupby.mean()

根据条件将新值添加到下面的行或下面新创建的行中

try 在树叶 map 上应用覆盖磁贴

根据二元组列表在pandas中创建新列

NP.round解算数据后NP.unique

基于字符串匹配条件合并两个帧

用NumPy优化a[i] = a[i-1]*b[i] + c[i]的迭代计算

从groupby执行计算后创建新的子框架

使用密钥字典重新配置嵌套字典密钥名

当我try 在django中更新模型时,模型表单数据不可见

旋转多边形而不改变内部空间关系

lityter不让我输入左边的方括号,'

如何获得满足掩码条件的第一行的索引?

Python:从目录内的文件导入目录

无法使用请求模块从网页上抓取一些产品的名称

利用广播使减法更有效率

当lambda函数作为参数传递时,pyo3执行

将索引表转换为Numy数组

为什么这个正则表达式没有捕获最后一次输入?