pk_cid是指客户的id,每个pk_partition代表em_acount(也就是销售的产品)当月的状态,所以如果客户在1月份有1个,2月份也有1个,说明他在1月份只买了一次。所以,如果一个客户在1月份有1个,2月份也有1个,这意味着他在1月份只买了一次。我想改变其余的月份有一个0,如果前一个月有一个1,以看到确切的时间,人们购买只保留第一个。
如果它的可能性在另一方面,如果一个人离开有一个-1
你可以创建一个pandas.Series.Series.Series.Series.Series.Series.Series.Series.Series.Series.Series.Series.Series.Series:
a = pd.Series({(15891, '2018-07-28'): 1,
(15891, '2018-08-28'): 0,
(16063, '2018-11-28'): 0,
(16063, '2018-12-28'): 0,
(16063, '2019-01-28'): 0,
(16063, '2019-02-28'): 0,
(16063, '2019-03-28'): 0,
(16063, '2019-04-28'): 0,
(16063, '2019-05-28'): 0,
(16203, '2018-12-28'): 0,
(16203, '2019-01-28'): 1,
(16203, '2019-02-28'): 1,
(16203, '2019-03-28'): 1,
(16203, '2019-04-28'): 1,
(16203, '2019-05-28'): 1,
(16502, '2018-09-28'): 0,
(16502, '2018-10-28'): 1,
(16502, '2018-11-28'): 1,
(16502, '2018-12-28'): 1,
(16502, '2019-01-28'): 1})
希望的输出
谢谢你
对指数进行排序,然后 groupby
user_id
得到 pct_change
并将数值设置为0,如果变化是在 <= 0
:
serie = pd.Series( {(15891, '2018-07-28'): 1, (15891, '2018-08-28'): 0,
(16063, '2018-11-28'): 0, (16063, '2018-12-28'): 0,
(16063, '2019-01-28'): 0, (16063, '2019-02-28'): 0,
(16063, '2019-03-28'): 0, (16063, '2019-04-28'): 0,
(16063, '2019-05-28'): 0, (16203, '2018-12-28'): 0,
(16203, '2019-01-28'): 1, (16203, '2019-02-28'): 1,
(16203, '2019-03-28'): 1, (16203, '2019-04-28'): 1,
(16203, '2019-05-28'): 1, (16502, '2018-09-28'): 0,
(16502, '2018-10-28'): 1, (16502, '2018-11-28'): 1,
(16502, '2018-12-28'): 1, (16502, '2019-01-28'): 1})
serie.sort_index(inplace=True)
serie [serie.groupby(level=0).pct_change() <= 0 ] = 0
serie
# 15891 2018-07-28 1
# 2018-08-28 0
# 16063 2018-11-28 0
# 2018-12-28 0
# 2019-01-28 0
# 2019-02-28 0
# 2019-03-28 0
# 2019-04-28 0
# 2019-05-28 0
# 16203 2018-12-28 0
# 2019-01-28 1
# 2019-02-28 0
# 2019-03-28 0
# 2019-04-28 0
# 2019-05-28 0
# 16502 2018-09-28 0
# 2018-10-28 1
# 2018-11-28 0
# 2018-12-28 0
# 2019-01-28 0
我认为这个逻辑是正确的,但它确实假定你的日期是按你的索引排序的。
s = pd.Series( {(15891, '2018-07-28'): 1, (15891, '2018-08-28'): 0,
(16063, '2018-11-28'): 0, (16063, '2018-12-28'): 0,
(16063, '2019-01-28'): 0, (16063, '2019-02-28'): 0,
(16063, '2019-03-28'): 0, (16063, '2019-04-28'): 0,
(16063, '2019-05-28'): 0, (16203, '2018-12-28'): 0,
(16203, '2019-01-28'): 1, (16203, '2019-02-28'): 1,
(16203, '2019-03-28'): 1, (16203, '2019-04-28'): 1,
(16203, '2019-05-28'): 1, (16502, '2018-09-28'): 0,
(16502, '2018-10-28'): 1, (16502, '2018-11-28'): 1,
(16502, '2018-12-28'): 1, (16502, '2019-01-28'): 1})
# groupby level 0
g = s.groupby(level=0)
# create a mask based on your logic
mask = ((g.shift(0)==1) & (g.shift(-1)==1) & (g.shift()==1)) | \
((g.shift(0)==1) & (g.shift(-1).isna()) & (g.shift()==1)) | \
((g.shift(0)==1) & (g.shift(-1)==0) & (g.shift()==1))
# assign all true values to 0
s[mask] = 0
print(s)
15891 2018-07-28 1
2018-08-28 0
16063 2018-11-28 0
2018-12-28 0
2019-01-28 0
2019-02-28 0
2019-03-28 0
2019-04-28 0
2019-05-28 0
16203 2018-12-28 0
2019-01-28 1
2019-02-28 0
2019-03-28 0
2019-04-28 0
2019-05-28 0
16502 2018-09-28 0
2018-10-28 1
2018-11-28 0
2018-12-28 0
2019-01-28 0