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