移动桶和出生/死亡委员会

2024-06-07 01:45:42 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个这种类型的数据帧(最简单的例子):

myDf = pd.DataFrame({'user': ['A'','B', 'C', 'D', 'E']*2,'date': ['2017-05-25']*5+['2017-05-26']*5,'nVisits':[10,2,3,0,0,6,0,4,8,1]})

在表中,如下所示:

date        nVisits user
5/25/2017   10      A
5/25/2017   2       B
5/25/2017   3       C
5/25/2017   0       D
5/25/2017   0       E
5/26/2017   6       A
5/26/2017   0       B
5/26/2017   4       C
5/26/2017   8       D
5/26/2017   1       E

(1)我想将我的用户每天分类为4个存储桶:0次访问、1次访问、2-4次访问、5次以上访问,因此我想创建如下所示的数据帧摘要:

date        group      nVisits  nObs
5/25/2017   zero       0        2
5/25/2017   one        0        0
5/25/2017   twoToFour  2        2
5/25/2017   fivePlus   10       1
5/26/2017   zero       0        1
5/26/2017   one        1        1
5/26/2017   twoToFour  4        1
5/26/2017   fivePlus   16       2

这个数据帧基本上是每个bucket的观察次数以及每个bucket的访问次数,其中哪个用户属于哪个bucket,每天更新一次。你知道吗

(2)我想对客户的所有出生和死亡进行分类,其中出生被分类为从0次就诊到>;1次就诊的客户,死亡被分类为从>;1次就诊到0次就诊的客户。你知道吗

在此特定示例中,新的数据帧如下所示:

date        event_type  user    nVisitsAtBirthDeath
5/26/2017   death       B       2
5/26/2017   birth       D       8
5/26/2017   birth       E       1

这个数据帧基本上是从今天到前一天的比较,从用户从0访问到多于或等于1访问,以及从多于或等于1访问到0访问。你知道吗

你能帮我开始学习如何高效高效地完成这项工作吗。我原来的数据帧比较大,所以python中的for循环运行得太慢。你知道吗


Tags: 数据用户gtdate客户bucket分类次数
3条回答

我会使用pd.cut()方法:

In [29]: df['group'] = pd.cut(df.nVisits,
                              [-1, 0, 1, 4, np.inf], 
                              labels=['zero','one','twoToFour','fivePlus'])

In [30]: df
Out[30]:
         date  nVisits user      group
0  2017-05-25       10    A   fivePlus
1  2017-05-25        2    B  twoToFour
2  2017-05-25        3    C  twoToFour
3  2017-05-25        0    D       zero
4  2017-05-25        0    E       zero
5  2017-05-26        6    A   fivePlus
6  2017-05-26        0    B       zero
7  2017-05-26        4    C  twoToFour
8  2017-05-26        8    D   fivePlus
9  2017-05-26        1    E        one

一种方法是使用np.哪里()

myDf[“组”]=np.哪里(myDf.nVisits公司>;5,'五加',np.哪里(myDf.nVisits公司==0,'零', np.哪里(myDf.nVisits公司==1,'一','四分之二'))

    date        nVisits user    group
0   2017-05-25  10      A       fiveplus
1   2017-05-25  2       B       twotofour
2   2017-05-25  3       C       twotofour
3   2017-05-25  0       D       zero
4   2017-05-25  0       E       zero
5   2017-05-26  6       A       fiveplus
6   2017-05-26  0       B       zero
7   2017-05-26  4       C       twotofour
8   2017-05-26  8       D       fiveplus
9   2017-05-26  1       E       one

解决方案1:

df1 = myDf.assign(group=pd.cut(myDf.nVisits,[0,1,2,5,np.inf],right=False,labels=['zero','one','twotoFour','fivePlus']))

输出:

         date  nVisits user      group
0  2017-05-25       10    A   fivePlus
1  2017-05-25        2    B  twotoFour
2  2017-05-25        3    C  twotoFour
3  2017-05-25        0    D       zero
4  2017-05-25        0    E       zero
5  2017-05-26        6    A   fivePlus
6  2017-05-26        0    B       zero
7  2017-05-26        4    C  twotoFour
8  2017-05-26        8    D   fivePlus
9  2017-05-26        1    E        one

df2 = df1.groupby(['date','group']).agg({'nVisits':'sum','user':'count'}).reset_index()

print(df2)

         date      group  user  nVisits
0  2017-05-25   fivePlus     1       10
1  2017-05-25  twotoFour     2        5
2  2017-05-25       zero     2        0
3  2017-05-26   fivePlus     2       14
4  2017-05-26        one     1        1
5  2017-05-26  twotoFour     1        4
6  2017-05-26       zero     1        0

解决方案2:

df2 = df1.assign(nVisitsAtBirthDeath=df1.groupby('user').filter(lambda x: x.nVisits.eq(0).any()).groupby('user')['nVisits'].apply(lambda x: x - x.shift())).dropna()

df3 = df2.assign(event=np.where(df2.nVisitsAtBirthDeath<0,'Death','Birth'))

print(df3)

输出:

         date  nVisits user     group  nVisitsAtBirthDeath  event
6  2017-05-26        0    B      zero                 -2.0  Death
8  2017-05-26        8    D  fivePlus                  8.0  Birth
9  2017-05-26        1    E       one                  1.0  Birth

相关问题 更多 >