Сводная таблица в Python

1

Я новичок в Python, и поэтому мне нужна ваша помощь по следующему:

У меня есть две таблицы (dataframes):

В таблице 1 приведены все данные, и это выглядит так:

Изображение 174551

В столбце GenDate есть день генерации. В столбце Дата указаны даты. Столбец D и далее имеют разные значения

У меня также есть следующая таблица:

Изображение 174551

В столбце я есть "ключевые слова", которые можно найти в заголовке таблицы 1. Столбец K имеет даты, которые должны быть в столбце C таблицы 1

Моя цель - создать таблицу следующим образом:

Изображение 174551

Я проиллюстрировал несколько столбцов для целей иллюстрации.

Каждый столбец таблицы 1 должен быть разделен на тип, который написан на заголовке.

Ex. A_Weeks: Недели соответствуют 3 сплитам, неделям1, неделя2 и неделя3

Каждая из этих разрезов имеет конкретную дату.

в новой таблице необходимо создать 3 столбца, используя A_, а затем имя разделения:

A_Week1, A_Week2 и A_Week3.

для каждого из этих столбцов следует использовать значение, соответствующее дате каждого раскола.

Надеюсь, объяснение будет хорошим.

Спасибо

  • 0
    Проверьте pd.pivot_table
Теги:
dataframe
python-3.x
pivot-table

1 ответ

1
Лучший ответ

Вы можете получить нужную таблицу со следующим кодом (следуйте комментариям и проверьте ссылку panda api, чтобы узнать о используемых функциях):

import numpy as np
import pandas as pd

# initial data
t_1 = pd.DataFrame(
    {'GenDate': [1, 1, 1, 2, 2, 2],
     'Date': [10, 20, 30, 10, 20, 30],
     'A_Days': [11, 12, 13, 14, 15, 16],
     'B_Days': [21, 22, 23, 24, 25, 26],
     'A_Weeks': [110, 120, 130, 140, np.NaN, 160],
     'B_Weeks': [210, 220, 230, 240, np.NaN, 260]})
# initial data
t_2 = pd.DataFrame(
    {'Type': ['Days', 'Days', 'Days', 'Weeks', 'Weeks'],
     'Split': ['Day1', 'Day2', 'Day3', 'Week1', 'Week2'],
     'Date': [10, 20, 30, 10, 30]})

# create multiindex
t_1 = t_1.set_index(['GenDate', 'Date'])
# pivot 'Date' level of MultiIndex - unstack it from index to columns
# and drop columns with all NaN values
tt_1 = t_1.unstack().dropna(axis=1)

# tt_1 is what you need with multi-level column labels

# map to rename columns
t_2 = t_2.set_index(['Type'])
mapping = {
    type_: dict(zip(
        t_2.loc[type_, :].loc[:, 'Date'],
        t_2.loc[type_, :].loc[:, 'Split']))
    for type_ in t_2.index.unique()}

# new column names
new_columns = list()
for letter_type, date in tt_1.columns.values:
    letter, type_ = letter_type.split('_')
    new_columns.append('{}_{}'.format(letter, mapping[type_][date]))

tt_1.columns = new_columns

Ещё вопросы

Сообщество Overcoder
Наверх
Меню