从活动的第一天开始检测用户流失

时间:2018-07-26 04:10:04

标签: python pandas

count-consecutive-ones-in-a-dataframe-and-get-indices-where-this-occurs的启发,我想做点不同的事情。

对于此DataFrame,id是索引。

id  day1    day2    day3    day4    day5    day6                                                                                        
1   24      0       0       0       0       0
2   15      0       3       0       0       0
3   9       0       0       0       0       0
4   20      1       0       0       0       0
5   4       0       0       0       0       0
6   3       0       0       1       3       0
7   3       0       0       0       0       0
8   8       0       0       0       2       0
9   8       0       2       0       0       0
10  0       5       2       0       0       0

我想计算有多少id(用户)在x零活动天数之后将不再有任何活动。

对于给定的功能f(x),并假设day6是最后一天,

f(2)应该返回8,因为id [1,2,3,4,5,7,9,10]在连续2个连续的0之后变成搅动。

f(4)应该返回5,因为id [1,3,4,5,7]在连续四个零之后没有任何活动。

我认为实现应为df.apply(f(x), axis=1),因此它在每一行上进行迭代并返回一个1 else 0列。例如df['churn=4'] = df.apply(f(x), axis=1)将返回:

id  day1    day2    day3    day4    day5    day6    'churn=4'                                                                                   
1   24      0       0       0       0       0       1
2   15      0       3       0       0       0       0
3   9       0       0       0       0       0       1
4   20      1       0       0       0       0       1
5   4       0       0       0       0       0       1
6   3       0       0       1       3       0       0
7   3       0       0       0       0       0       1
8   8       0       0       0       2       0       0
9   8       0       2       0       0       0       0
10  0       5       2       0       0       0       0

因此,我可以对新列进行汇总,以获得churn = 4'用户总数。

即使在起草问题时,我自己也有些复杂,如果不清楚,请告诉我。

1 个答案:

答案 0 :(得分:0)

合并值,将其转换为整数,然后计算最后一个零。

SELECT substances, 'annex2' AS table_name
FROM   annex2
WHERE  substances LIKE '%methyl%'
UNION ALL
SELECT substances, 'annex3' AS table_name
FROM   annex3
WHERE  substances like '%methyl%'

没有功能

import numpy as np
  • 其中np.logical_not(df.iloc[:,1:].astype(str).apply(''.join, axis=1).astype(int) % 10**4).astype(int) 表示4个零。

具有功能:

10**4

输出:

def f(x, num):
    return np.logical_not(int(''.join(x[1:].astype(str)))% 10**num).astype(int)

df.apply(f, num=4, axis=1)