首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建反映每个客户过去5个事务的5个新列?

如何创建反映每个客户过去5个事务的5个新列?
EN

Stack Overflow用户
提问于 2019-08-11 10:26:55
回答 2查看 56关注 0票数 2

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

代码语言:javascript
复制
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个新的列,基于“金额”栏的转移。

下面的代码工作得很好

代码语言:javascript
复制
for obs in range(1,6):
    df['S_'+ str(obs)] = df.Amount.shift(obs)

输出:

代码语言:javascript
复制
    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进行分组,然后对每个客户的数量进行调整。

我无法做到这一点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-11 10:40:25

您可以在移动时使用groupby:

代码语言:javascript
复制
for obs in range(1,6):
    df['S_'+ str(obs)] = df.groupby(["customer_id"]).Amount.shift(obs)

这会导致

代码语言:javascript
复制
    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
票数 4
EN

Stack Overflow用户

发布于 2019-08-11 10:42:29

您可以在自己的逻辑中使用.apply,如下所示:

代码语言:javascript
复制
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))

输出:

代码语言:javascript
复制
    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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57449174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档