Как преобразовать фрейм данных pandas — заголовки столбцов и строк

Это мой исходный фрейм данных:

А Б С Д Э 2020 год_АА 2020 год_AB 2021 год_АА 2021 год_AB абв абв НЭН НЭН абв 0 0 0 0

Я хочу преобразовать фрейм данных в:

А Б С Д Э Год АА АБ абв абв НЭН НЭН абв 2020 год 0 0 абв абв НЭН НЭН абв 2021 год 0 0

Я попытался использовать следующие строки кода: df.melt преобразует данные в структуру ниже, но Pivot_table не работает и показывает пустой фрейм данных:

# Melt the DataFrame
df_melt = df.melt(id_vars=['A', 'B', 'C', 'D', 'E'], var_name='Type', value_name='Value')

# Split the 'Type' column into 'Delivery Year' and 'Type'
df_melt[['Delivery Year', 'Type']] = df_melt['Type'].str.rsplit('_', n=1, expand=True)

# Pivot the DataFrame
pivot_df = df_melt.pivot_table(index=['A', 'B', 'C', 'D', 'E', 'Delivery Year'], columns='Type', values='Value', fill_value=0).reset_index()
А Б С Д Э Тип Ценить Год поставки абв абв НЭН НЭН абв АА 0 2020 год абв абв НЭН НЭН абв АБ 0 2020 год абв абв НЭН НЭН абв АА 0 2021 год абв абв НЭН НЭН абв АБ 0 2021 год

Чтобы воссоздать мой фрейм данных, используйте следующий код:

df = pd.DataFrame({
    'A': 'abc',
    'B': 'abc',
    'C': np.NaN,
    'D': np.NaN,
    'E': 'abc',
    'Year 2020_AA': [0],
    'Year 2020_AB': [0],
    'Year 2021_AA': [0],
    'Year 2021_AB': [0]
})

Любое руководство приветствуется.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Код

out = (df.set_index(['A', 'B', 'C', 'D', 'E'])
         .pipe(lambda x: x.set_axis(
             x.columns.str.split(' ').str[1].str.split('_', expand=True), axis=1)
              )
         .stack(0).reset_index().rename({'level_5': 'Year'}, axis=1)
)

вне:


Чтобы сделать приведенный выше код более понятным, он будет выглядеть так:

tmp = df.set_index(['A', 'B', 'C', 'D', 'E'])
idx = tmp.columns.str.split(' ').str[1].str.split('_', expand=True)
idx.names = ['Year',None]
out = tmp.set_axis(idx, axis=1).stack(0,future_stack=True).reset_index()

тот же результат

Ответ принят как подходящий

Один из вариантов — janitor.pivot_longer , где вы передаете регулярное выражение для изменения формы кадра данных. «.value» указывает, что эта часть столбца должна оставаться заголовком:

# pip install pyjanitor
import pandas as pd
import janitor
(df
.pivot_longer(
    index=['A','B','C','D','E'], 
    names_to = ('Year','.value'), 
    names_pattern=r"Year\s(\d+)_(.+)")
)

     A    B   C   D    E  Year  AA  AB
0  abc  abc NaN NaN  abc  2020   0   0
1  abc  abc NaN NaN  abc  2021   0   0

Это хорошо работает! Большое спасибо :)

sharkys 12.07.2024 15:32

Другие вопросы по теме