基本上任务是,对于每个客户,最后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