我有这样的数据:
videoId viewedMinutes totalMinutes user_drop TotalUsers
1017479 0 5 8 34
1017479 1 5 3 34
1017479 2 5 2 34
1017479 4 5 3 34
1017479 5 5 19 34
1036704 0 16 1 14
1036704 1 16 2 14
1036704 2 16 2 14
1036704 3 16 1 14
1036704 5 16 1 14
1036704 6 16 1 14
1036704 8 16 2 14因此,我想创建一个新的列active_users minute,如下所示:
videoId viewedMinutes totalMinutes user_drop TotalUsers active_users
1017479 0 5 8 34 34 (1st is fixed)
1017479 1 5 3 34 26(34(active_users)-8(user_drop))
1017479 2 5 2 34 23(26-3)
1017479 4 5 3 34 21(23-2)
1017479 5 5 18 34 18(21-3)
1036704 0 16 1 14 14
1036704 1 16 2 14 12
1036704 2 16 2 14 10
1036704 3 16 1 14 9
1036704 5 16 1 14 8
1036704 6 16 1 14 7
1036704 8 16 6 14 6因此,它与对角相减一样,但第一和最后的值将保持不变。另外,我希望这个算法能为每个唯一的videoId运行,而不是在我的数据文件中运行。
现在使用for循环,我想为每一个唯一的videoId绘制一个散点图,在X轴上有分钟,没有。Y轴中的活动用户。该图形将如下所示:retention.jpg
发布于 2018-08-23 12:57:57
使用带有自定义函数的groupby和cumsum和shift -对于第一行创建的NaN值,参数fill_value=0的sub函数忽略该值。
s = df.groupby('videoId')['user_drop'].apply(lambda x: x.cumsum().shift())
df['active'] = df['TotalUsers'].sub(s, fill_value=0).astype(int)
print (df)
videoId viewedMinutes totalMinutes user_drop TotalUsers active
0 1017479 0 5 8 34 34
1 1017479 1 5 3 34 26
2 1017479 2 5 2 34 23
3 1017479 4 5 3 34 21
4 1017479 5 5 19 34 18
5 1036704 0 16 1 14 14
6 1036704 1 16 2 14 13
7 1036704 2 16 2 14 11
8 1036704 3 16 1 14 9
9 1036704 5 16 1 14 8
10 1036704 6 16 1 14 7
11 1036704 8 16 2 14 6编辑:
散点图使用:
for i, df in df.groupby('videoId'):
ax = df.plot.scatter(x='viewedMinutes', y='active')
ax.set_title(i, fontsize=20)https://stackoverflow.com/questions/51986331
复制相似问题