Изменение формы / поворот данных со значением даты - PullRequest
0 голосов
/ 16 октября 2018

Мне нужно повернуть / изменить форму данных длинной формы двумя способами: 1) добавление столбцов даты (End-of_month) и заполнение числового значения (всего) 2) добавление столбцов даты (End-of_month) и заполнение значения даты (день-месяца, который достиг значения 'total' в предыдущем пивоте)

Я могу сделать 1 с:

data = pd.DataFrame({'date': ['1-12-2016', '1-23-2016', '2-23-2016', '2-1-2016', '3-4-2016'],
        'EOM': ['1-31-2016', '1-31-2016', '2-28-2016', '2-28-2016', '3-31-2016'],
        'country':['uk', 'usa', 'fr','fr','uk'],
        'tr_code': [10, 21, 20, 10,12],
        'TOTAL': [435, 367,891,1234,231]
        })

data['EOM'] = pd.to_datetime(data['EOM'])
data['date'] = pd.to_datetime(data['date'])


data_total = data.pivot_table(values='TOTAL', index=['country','tr_code'], columns='EOM')

Out[73]: 
EOM              2016-01-31  2016-02-28  2016-03-31
country tr_code                                    
fr      10              NaN      1234.0         NaN
        20              NaN       891.0         NaN
uk      10            435.0         NaN         NaN
        12              NaN         NaN       231.0
usa     21            367.0         NaN         NaN

Однако попытка изменить аргумент значения с помощью 'date' приводит к: DataError: Нет числовых типов для агрегирования

Я в основном хочу два df - один, который я выполнил, и другой в том же формате, но вместо значения 'TOTAL' - 'date', в которой было достигнуто это общее число.

Любая помощь с благодарностью.

1 Ответ

0 голосов
/ 16 октября 2018

set_index с unstack

Предполагается, что комбинации ['country', 'tr_code', 'EOM'] являются уникальными, и в противном случае они будут нарушены.Вот почему функция агрегации важна.Нам нужно правило, если и когда мы получим несколько наблюдений комбинации.

data.set_index(['country', 'tr_code', 'EOM']).date.unstack()

EOM             2016-01-31 2016-02-28 2016-03-31
country tr_code                                 
fr      10             NaT 2016-02-01        NaT
        20             NaT 2016-02-23        NaT
uk      10      2016-01-12        NaT        NaT
        12             NaT        NaT 2016-03-04
usa     21      2016-01-23        NaT        NaT

aggfunc / pivot_table

Функция агрегирования по умолчанию - mean, и этоне имеет смысла для дат.first сделает.Также мог бы использовать last, который использовал ALollz в своем удаленном ответе.

data.pivot_table(
    values='date', index=['country', 'tr_code'], columns='EOM', aggfunc='first')

EOM             2016-01-31 2016-02-28 2016-03-31
country tr_code                                 
fr      10             NaT 2016-02-01        NaT
        20             NaT 2016-02-23        NaT
uk      10      2016-01-12        NaT        NaT
        12             NaT        NaT 2016-03-04
usa     21      2016-01-23        NaT        NaT

groupby

Менее эффектный способ сделать то же самое, что и pivot_table

data.groupby(['country', 'tr_code', 'EOM']).date.first().unstack()

EOM             2016-01-31 2016-02-28 2016-03-31
country tr_code                                 
fr      10             NaT 2016-02-01        NaT
        20             NaT 2016-02-23        NaT
uk      10      2016-01-12        NaT        NaT
        12             NaT        NaT 2016-03-04
usa     21      2016-01-23        NaT        NaT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...