import polars as pl

df = pl.DataFrame({
    'A': range(1,4),
    'B': range(1,4),
    'C': range(1,4),
    'D': range(1,4)
})

print(df)
shape: (3, 4)
┌─────┬─────┬─────┬─────┐
│ A   ┆ B   ┆ C   ┆ D   │
│ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 ┆ i64 │
╞═════╪═════╪═════╪═════╡
│ 1   ┆ 1   ┆ 1   ┆ 1   │
│ 2   ┆ 2   ┆ 2   ┆ 2   │
│ 3   ┆ 3   ┆ 3   ┆ 3   │
└─────┴─────┴─────┴─────┘
df_melt = df.melt(
    variable_name="recipe",
    value_name="revenue")

print(df_melt)
shape: (12, 2)
┌────────┬─────────┐
│ recipe ┆ revenue │
│ ---    ┆ ---     │
│ str    ┆ i64     │
╞════════╪═════════╡
│ A      ┆ 1       │
│ A      ┆ 2       │
│ A      ┆ 3       │
│ B      ┆ 1       │
│ B      ┆ 2       │
│ …      ┆ …       │
│ C      ┆ 2       │
│ C      ┆ 3       │
│ D      ┆ 1       │
│ D      ┆ 2       │
│ D      ┆ 3       │
└────────┴─────────┘

似乎我需要添加一个索引,以便将df_melt旋转回原始形式df?有没有办法在不添加索引的情况下旋转一个极地框架?

df_melt = df_melt.with_columns(index=pl.col("revenue").cum_count().over("recipe"))

df_melt.pivot(
    index='index',
    columns='recipe',
    values='revenue',
    aggregate_function='first'
)
shape: (3, 5)
┌───────┬─────┬─────┬─────┬─────┐
│ index ┆ A   ┆ B   ┆ C   ┆ D   │
│ ---   ┆ --- ┆ --- ┆ --- ┆ --- │
│ u32   ┆ i64 ┆ i64 ┆ i64 ┆ i64 │
╞═══════╪═════╪═════╪═════╪═════╡
│ 1     ┆ 1   ┆ 1   ┆ 1   ┆ 1   │
│ 2     ┆ 2   ┆ 2   ┆ 2   ┆ 2   │
│ 3     ┆ 3   ┆ 3   ┆ 3   ┆ 3   │
└───────┴─────┴─────┴─────┴─────┘

在R中,我可以执行等同于melt和pivot而不带索引,并且在Python中寻求相同的功能.

df_pandas = df.to_pandas()
library(tidyverse)
library(reticulate)

df_long <-
    py$df_pandas |>
    pivot_longer(
        everything(),
        names_to = 'recipe',
        values_to = 'value'
    )

df_long |>
    pivot_wider(
        names_from='recipe',
        values_from='value'
    ) |>
    unnest(cols = c(A,B,C,D))

推荐答案

似乎我需要添加一个索引,以便将df_melt旋转回df的原始形式?

否则,它如何决定df_melt中的条目与revenue=1都在同一行上,而不是recipe=A的收入是2,recipe=B的收入是3,等等?你是从你如何定义df推断的,但从你的问题中定义的df_melt推断的,这是不可能的.

如果这是一个要求,那么我建议您在使用melt之前将索引添加到df,以便df_melt携带该信息:

>>> df_melt=df.with_row_index().melt(id_vars=["index"], variable_name="recipe",value_name="revenue")  
>>> df_melt
shape: (12, 3)
┌───────┬────────┬─────────┐
│ index ┆ recipe ┆ revenue │
│ ---   ┆ ---    ┆ ---     │
│ u32   ┆ str    ┆ i64     │
╞═══════╪════════╪═════════╡
│ 0     ┆ A      ┆ 1       │
│ 1     ┆ A      ┆ 2       │
│ 2     ┆ A      ┆ 3       │
│ 0     ┆ B      ┆ 1       │
│ 1     ┆ B      ┆ 2       │
│ …     ┆ …      ┆ …       │
│ 1     ┆ C      ┆ 2       │
│ 2     ┆ C      ┆ 3       │
│ 0     ┆ D      ┆ 1       │
│ 1     ┆ D      ┆ 2       │
│ 2     ┆ D      ┆ 3       │
└───────┴────────┴─────────┘

然后,枢轴可以使用index列来重建原始数据.

Python相关问答推荐

对某些列的总数进行民意调查,但不单独列出每列

Django mysql图标不适用于小 case

运行Python脚本时,用作命令行参数的SON文本

如何在类和classy-fastapi -fastapi- followup中使用FastAPI创建路由

无法使用requests或Selenium抓取一个href链接

Python,Fitting into a System of Equations

如何使用表达式将字符串解压缩到Polars DataFrame中的多个列中?

如何在UserSerializer中添加显式字段?

如何使用使用来自其他列的值的公式更新一个rabrame列?

在方法中设置属性值时,如何处理语句不可达[Unreacable]";的问题?

在Admin中显示从ManyToMany通过模型的筛选结果

无法在Spyder上的Pandas中将本地CSV转换为数据帧

根据Pandas中带条件的两个列的值创建新列

如何使用Azure Function将xlsb转换为xlsx?

使用SQLAlchemy从多线程Python应用程序在postgr中插入多行的最佳方法是什么?'

为罕见情况下的回退None值键入

为什么在Python中00是一个有效的整数?

python3中np. divide(x,y)和x/y有什么区别?'

用0填充没有覆盖范围的垃圾箱

如何在python tkinter中绑定键盘上的另一个回车?