我需要以两种方式转动/重塑长格式数据: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'.
任何帮助是极大的赞赏.
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
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)
| 归档时间: |
|
| 查看次数: |
32 次 |
| 最近记录: |