如何保持第一条的ID? pandas python

问题描述 投票:1回答:2

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})

希望的输出

请在此输入图片描述

谢谢你

python pandas dataframe group-by diff
2个回答
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

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
© www.soinside.com 2019 - 2024. All rights reserved.