基本任务是,对于每一个客户,最后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进行分组,然后对每个客户的数量进行调整。
我无法做到这一点。
发布于 2019-08-11 10:40:25
您可以在移动时使用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发布于 2019-08-11 10:42:29
您可以在自己的逻辑中使用.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.0https://stackoverflow.com/questions/57449174
复制相似问题