使用日期值重塑/透视数据

How*_*ude 3 python-3.x pandas

我需要以两种方式转动/重塑长格式数据:1)添加日期列(End-of_month)并填写数值(总计)2)添加日期列(End-of_month)并填写日期值(日期)在前一个支点中达到'总'值的月份)

我可以做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
Run Code Online (Sandbox Code Playgroud)

但是,尝试使用'date'更改value参数会产生:DataError:无需聚合的数字类型

我基本上想要两个df - 我完成的那个,以及相同格式的另一个,但不是'TOTAL'值而是完成总计的'date'.

任何帮助是极大的赞赏.

piR*_*red 7

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)