首页 > 解决方案 > 如何创建反映每个客户过去 5 次交易的 5 个新列?

问题描述

基本上任务是每个客户最后 5 笔交易应该出现,但它应该仅基于该客户。

df = pd.DataFrame({
    "customer_id": [121,121,121,121,121,121,121,233,233,233,233,233,233,233,233],
    "Amount": [500,300,400,239,568,243,764,890,456,420,438,234,476,568,243,]
})

因此,我正在尝试根据“金额”列的移动创建 5 个新列。

对于这个下面的代码运行良好

for obs in range(1,6):
    df['S_'+ str(obs)] = df.Amount.shift(obs)

输出:

    customer_id  Amount    S_1    S_2    S_3    S_4    S_5
0           121     500    NaN    NaN    NaN    NaN    NaN
1           121     300  500.0    NaN    NaN    NaN    NaN
2           121     400  300.0  500.0    NaN    NaN    NaN
3           121     239  400.0  300.0  500.0    NaN    NaN
4           121     568  239.0  400.0  300.0  500.0    NaN
5           121     243  568.0  239.0  400.0  300.0  500.0
6           121     764  243.0  568.0  239.0  400.0  300.0
7           233     890  764.0  243.0  568.0  239.0  400.0
8           233     456  890.0  764.0  243.0  568.0  239.0
9           233     420  456.0  890.0  764.0  243.0  568.0
10          233     438  420.0  456.0  890.0  764.0  243.0
11          233     234  438.0  420.0  456.0  890.0  764.0
12          233     476  234.0  438.0  420.0  456.0  890.0
13          233     568  476.0  234.0  438.0  420.0  456.0
14          233     243  568.0  476.0  234.0  438.0  420.0

问题

通过这种方法,索引号 7 中的下一个客户也显示以前的客户交易是错误的。应该是 NaN

我想我需要根据 customer_id 进行分组,然后为每个客户转移金额

而我无法做到这一点。

标签: pythonpython-3.xpandaspandas-groupby

解决方案


移位时可以使用 groupby:

for obs in range(1,6):
    df['S_'+ str(obs)] = df.groupby(["customer_id"]).Amount.shift(obs)

这导致

    customer_id  Amount    S_1    S_2    S_3    S_4    S_5
0           121     500    NaN    NaN    NaN    NaN    NaN
1           121     300  500.0    NaN    NaN    NaN    NaN
2           121     400  300.0  500.0    NaN    NaN    NaN
3           121     239  400.0  300.0  500.0    NaN    NaN
4           121     568  239.0  400.0  300.0  500.0    NaN
5           121     243  568.0  239.0  400.0  300.0  500.0
6           121     764  243.0  568.0  239.0  400.0  300.0
7           233     890    NaN    NaN    NaN    NaN    NaN
8           233     456  890.0    NaN    NaN    NaN    NaN
9           233     420  456.0  890.0    NaN    NaN    NaN
10          233     438  420.0  456.0  890.0    NaN    NaN
11          233     234  438.0  420.0  456.0  890.0    NaN
12          233     476  234.0  438.0  420.0  456.0  890.0
13          233     568  476.0  234.0  438.0  420.0  456.0
14          233     243  568.0  476.0  234.0  438.0  420.0

推荐阅读