Поворот и последующий поворот с сохранением исходных типов данных в кадре данных без каких-либо операций повторного аналPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Поворот и последующий поворот с сохранением исходных типов данных в кадре данных без каких-либо операций повторного анал

Сообщение Anonymous »

Рассмотрим следующий пример:

Код: Выделить всё

from enum import Enum
import polars as pl
from typing import NamedTuple

Months = Enum(
"MONTHS",
[
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec",
],
)

plMonths = pl.Enum([m.name for m in Months])

plYearMonth = pl.Struct({"year": int, "month": plMonths})

class YearMonth(NamedTuple):
year: int
month: str

dates = pl.Series(
"year_months",
[YearMonth(2024, Months.Jan.name), YearMonth(2024, Months.Feb.name)],
dtype=plYearMonth,
)

values = pl.Series("value", [0, 1])

hellos = pl.Series("hello", ["a"]*2 + ["b"]*2)

Код: Выделить всё

df = pl.DataFrame({
"hello": pl.Series(["a", "a", "b", "b"]),
"date": pl.concat([dates, dates]),
"value": pl.concat([values, values.reverse()])
})
df

Код: Выделить всё

shape: (4, 3)
┌───────┬──────────────┬───────┐
│ hello ┆ date         ┆ value │
│ ---   ┆ ---          ┆ ---   │
│ str   ┆ struct[2]    ┆ i64   │
╞═══════╪══════════════╪═══════╡
│ a     ┆ {2024,"Jan"} ┆ 0     │
│ a     ┆ {2024,"Feb"} ┆ 1     │
│ b     ┆ {2024,"Jan"} ┆ 1     │
│ b     ┆ {2024,"Feb"} ┆ 0     │
└───────┴──────────────┴───────┘
Затем я поворачиваю df:

Код: Выделить всё

pivoted = df.pivot(index="hello", columns="date", values="value")
pivoted

Код: Выделить всё

shape: (2, 3)
┌───────┬──────────────┬──────────────┐
│ hello ┆ {2024,"Jan"} ┆ {2024,"Feb"} │
│ ---   ┆ ---          ┆ ---          │
│ str   ┆ i64          ┆ i64          │
╞═══════╪══════════════╪══════════════╡
│ a     ┆ 0            ┆ 1            │
│ b     ┆ 1            ┆ 0            │
└───────┴──────────────┴──────────────┘
Заголовки теперь стали строками, что вполне понятно, как можно увидеть с помощью следующего отката:

Код: Выделить всё

unpivoted = pivoted.melt(id_vars="hello", variable_name="date", value_name="value")
unpivoted

Код: Выделить всё

shape: (4, 3)
┌───────┬──────────────┬───────┐
│ hello ┆ date         ┆ value │
│ ---   ┆ ---          ┆ ---   │
│ str   ┆ str          ┆ i64   │
╞═══════╪══════════════╪═══════╡
│ a     ┆ {2024,"Jan"} ┆ 0     │
│ b     ┆ {2024,"Jan"} ┆ 1     │
│ a     ┆ {2024,"Feb"} ┆ 1     │
│ b     ┆ {2024,"Feb"} ┆ 0     │
└───────┴──────────────┴───────┘
Но помните, что исходный столбец даты в df имел тип данных структуры plYearMonth. Есть ли вообще способ выполнить разворот, чтобы данные unpivoted date снова интерпретировались как plYearMonth без выполнения операции повторного анализа?
Я думаю, что это невозможно, и вместо этого лучше иметь словарь, который сопоставляет строковое и структурное представление?


Подробнее здесь: https://stackoverflow.com/questions/786 ... -in-the-da
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»