Pivot Pandas 只保留某些列
Pivot Pandas keeping only certain columns
正在尝试安排以下DF
pdf = pd.DataFrame({'num' : ['A1', "A1", 'A1', 'A2', "A3", 'A3', "A3", 'A3', 'A3'],
'end_date' : ['2020-12-31', '2019-09-30', '2017-08-31', '2019-12-31', '2017-12-31', '2016-12-31', '2015-12-31', '2014-12-31', '2013-12-31'],
'amount' : [12000, 15000, 2000, 400000, 56500, 89000, 100000, 500, 8000],
'product' : ['car', 'bike', 'other', 'house', 'other', 'other', 'other', 'other', 'other'] })
pdf
num end_date amount product
A1 2020-12-31 12000 car
A1 2019-09-30 15000 bike
A1 2017-08-31 2000 other
A2 2019-12-31 400000 house
A3 2017-12-31 56500 other
A3 2016-12-31 89000 other
A3 2015-12-31 100000 other
A3 2014-12-31 500 other
A3 2013-12-31 8000 other
目的是只保留最后 3 个值,如下所示
num N N-1 N-2 product
A1 12000 NaN NaN car
A1 15000 NaN NaN bike
A1 2000 NaN NaN other
A2 400000 NaN NaN house
A3 56500 89000 100000 other
这是我迄今为止尝试过的方法,但没有成功..
pdf.pivot_table(index = ['num', 'product'], columns = ['end_date', ], values = 'amount').reset_index()
num product 2013-12-31 2014-12-31 2015-12-31 2016-12-31 2017-08-31 2017-12-31 2019-09-30 2019-12-31 2020-12-31
A1 bike NaN NaN NaN NaN NaN NaN 15,000.00 NaN NaN
A1 car NaN NaN NaN NaN NaN NaN NaN NaN 12,000.00
A1 other NaN NaN NaN NaN 2,000.00 NaN NaN NaN NaN
A2 house NaN NaN NaN NaN NaN NaN NaN 400,000.00 NaN
A3 other 8,000.00 500.00 100,000.00 89,000.00 NaN 56,500.00 NaN NaN NaN
我不确定我是否正确理解了你的问题。但是你想在最后 3 次约会之后重新开始吗?在您的实际数据 table 中,您在 end_date 列中有 9 个不同的日期,因此预计当您在 end_date 列上旋转时,您将生成 9 个新列,如上一个屏幕截图所示.
如果您只想根据最后 3 个日期进行数据透视,您可以删除其他行,然后向上进行数据透视。
思路是groupby
'num'和'product',为每组挑选三个最大的日期,unstack
索引的第二层。其余的让它看起来很漂亮:
pdf['end_date'] = pd.to_datetime(pdf['end_date'])
(pdf.groupby(['num','product'])
.apply(lambda g:g.nlargest(3, 'end_date').reset_index())['amount']
.unstack()
.reset_index()
.rename(columns = {0:'N', 1:'N-1', 2:'N-2'})
)
输出:
num product N N-1 N-2
-- ----- --------- ------ ----- ------
0 A1 bike 15000 nan nan
1 A1 car 12000 nan nan
2 A1 other 2000 nan nan
3 A2 house 400000 nan nan
4 A3 other 56500 89000 100000
正在尝试安排以下DF
pdf = pd.DataFrame({'num' : ['A1', "A1", 'A1', 'A2', "A3", 'A3', "A3", 'A3', 'A3'],
'end_date' : ['2020-12-31', '2019-09-30', '2017-08-31', '2019-12-31', '2017-12-31', '2016-12-31', '2015-12-31', '2014-12-31', '2013-12-31'],
'amount' : [12000, 15000, 2000, 400000, 56500, 89000, 100000, 500, 8000],
'product' : ['car', 'bike', 'other', 'house', 'other', 'other', 'other', 'other', 'other'] })
pdf
num end_date amount product
A1 2020-12-31 12000 car
A1 2019-09-30 15000 bike
A1 2017-08-31 2000 other
A2 2019-12-31 400000 house
A3 2017-12-31 56500 other
A3 2016-12-31 89000 other
A3 2015-12-31 100000 other
A3 2014-12-31 500 other
A3 2013-12-31 8000 other
目的是只保留最后 3 个值,如下所示
num N N-1 N-2 product
A1 12000 NaN NaN car
A1 15000 NaN NaN bike
A1 2000 NaN NaN other
A2 400000 NaN NaN house
A3 56500 89000 100000 other
这是我迄今为止尝试过的方法,但没有成功..
pdf.pivot_table(index = ['num', 'product'], columns = ['end_date', ], values = 'amount').reset_index()
num product 2013-12-31 2014-12-31 2015-12-31 2016-12-31 2017-08-31 2017-12-31 2019-09-30 2019-12-31 2020-12-31
A1 bike NaN NaN NaN NaN NaN NaN 15,000.00 NaN NaN
A1 car NaN NaN NaN NaN NaN NaN NaN NaN 12,000.00
A1 other NaN NaN NaN NaN 2,000.00 NaN NaN NaN NaN
A2 house NaN NaN NaN NaN NaN NaN NaN 400,000.00 NaN
A3 other 8,000.00 500.00 100,000.00 89,000.00 NaN 56,500.00 NaN NaN NaN
我不确定我是否正确理解了你的问题。但是你想在最后 3 次约会之后重新开始吗?在您的实际数据 table 中,您在 end_date 列中有 9 个不同的日期,因此预计当您在 end_date 列上旋转时,您将生成 9 个新列,如上一个屏幕截图所示.
如果您只想根据最后 3 个日期进行数据透视,您可以删除其他行,然后向上进行数据透视。
思路是groupby
'num'和'product',为每组挑选三个最大的日期,unstack
索引的第二层。其余的让它看起来很漂亮:
pdf['end_date'] = pd.to_datetime(pdf['end_date'])
(pdf.groupby(['num','product'])
.apply(lambda g:g.nlargest(3, 'end_date').reset_index())['amount']
.unstack()
.reset_index()
.rename(columns = {0:'N', 1:'N-1', 2:'N-2'})
)
输出:
num product N N-1 N-2
-- ----- --------- ------ ----- ------
0 A1 bike 15000 nan nan
1 A1 car 12000 nan nan
2 A1 other 2000 nan nan
3 A2 house 400000 nan nan
4 A3 other 56500 89000 100000