我有一个数组,如下所示:
year week app_id period
0 2015 22 [g8m4lecv, uyhsx6lo, u9ue1zzo, kw06m3f5, wvqhq... 2015-22
1 2015 23 [608a223c57e1174fc64775dd2fd8cda387cc4a47, ze4... 2015-23
2 2015 24 [kz8udlea, zwqo7j8w, 6d02c9d74b662369dc6c53ccc... 2015-24
3 2015 25 [fgs0qhtf, awkcmpns, e0iraf3a, oht91x5j, mv4uo... 2015-25
4 2015 26 [zwqo7j8w, dzdfiof5, phwoy1ea, e7hfx7mu, 40fdd... 2015-26
和唯一ID的DataFrame:
unique_app_ids
0 g8m4lecv
1 uyhsx6lo
2 u9ue1zzo
3 kw06m3f5
4 wvqhq7d7
5 fucjx9ar
6 ede963a7c7b854938c1196bb83dc3a0924951055
7 ze4rr0vi
我想做的是,对于unique_app_ids:中的每个app_id
- 根据数组中的周期查找它的第一个出现
- 如果发生这种情况,请跟踪开始日期并将每周使用量增加一
- 转到下一个周期,如果app_id仍然存在,则递增一
- 如果应用程序id不存在,则停止递增
然后,我希望在weekly usage
的唯一id列中有一列。
以下是我目前的处境:
startperiod = True;
stopped = True;
usage = 0
weeklyadoption= adopters['app_id'].values;
def retention_rate(row):
for app_id in retention['unique_app_ids']:
for week in range(len(weeklyadoption)):
if weeklyadoption[week].isin(app_id):
stopped = False;
usage+=1
else:
stopped = True;
return usage
retention['weekly_retention']=retention.apply(retention_rate, axis=1)
其中retention
是唯一id的数据帧,adopters
是数组的数组。然而,我还没有测试代码,因为我很难思考:
- 代码目前正在经历每个周期,当一个周期什么都没有的时候,它就会爆发。然而,假设第一次使用是向下4行,我只想循环开始,然后从开始的周期开始递增和中断
- 如何不仅检查app_id是否在当前行中,而且检查自开始使用期以来该行之前的所有其他行中
编辑
即使是当前的代码也没有循环通过。我得到:
AttributeError: ("'numpy.ndarray' object has no attribute 'isin'", u'occurred at index 0')
注意,打印出来的weeklyadoption
是这样的:
[([array],[array]....)]
您尝试做的事情有几个问题:
-
循环中有一个
return
语句,这就是它退出循环的原因。 -
目前尚不清楚为什么将2d数据存储在数组中,而将1d数据存储在DataFrame中。相反的情况对我来说更有意义。
以下是我基于这些建议的实施的解决方案:
weekly_usage = {}
df['app_id_str'] = df['app_id'].apply(lambda x: ('|').join(x))
for app_id in unique_app_ids:
temp = df[df['app_id_str'].str.contains(app_id)].sort('period')
# at this point, if it's continuous, you can just take the length
# start, end = temp['period'].min(), temp['period'].max()
duration = len(temp) #or you can use timedelta if you want a time difference
weekly_usage[app_id] = duration
这样你就有了一个unique_id及其持续时间的字典,你可以随心所欲地显示它们。