使用日期值重塑/旋转数据



我需要以 2 种方式透视/重塑长格式数据: 1(添加日期列(结束of_month(并填写数值(总计( 2(添加日期列(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

但是,尝试使用"date"更改值参数会产生: 数据错误:没有要聚合的数值类型

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

任何帮助将不胜感激。

set_indexwithunstack

这假设['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会的。 也可能使用ALollz在删除的答案中使用的last

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

最新更新