如何创建 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进行分组,然后为每个客户转移金额

而我做不到。

您可以在移位时使用 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

您可以使用.groupby然后使用自己的逻辑.apply,如下所示:

import pandas as pd
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]
})

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

print(df.groupby("customer_id").apply(add_S_cols))

输出:

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

相关内容

最新更新