首页 > 解决方案 > 使用日期值重塑/透视数据

问题描述

我需要以 2 种方式旋转/重塑长表单数据:1)添加日期列(End-of_month)并填写数值(总计)2)添加日期列(End-of_month)并填写日期值(day-of-在上一个数据透视中达到“总”值的月份)

我可以做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

但是,尝试使用“日期”更改值参数会产生:DataError: No numeric types to aggregate

我基本上想要两个df - 我完成的一个,另一个格式相同的,但不是“TOTAL”值,而是完成该总数的“日期”。

任何帮助是极大的赞赏。

标签: python-3.xpandas

解决方案


set_indexunstack

这假设 的组合['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会做。也可以使用lastALollz 在他们删除的答案中使用的。

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

推荐阅读