如何遍历数组panda并检查项目的第一次和最后一次出现



我有一个数组,如下所示:

    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

  1. 根据数组中的周期查找它的第一个出现
  2. 如果发生这种情况,请跟踪开始日期并将每周使用量增加一
  3. 转到下一个周期,如果app_id仍然存在,则递增一
  4. 如果应用程序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是数组的数组。然而,我还没有测试代码,因为我很难思考:

  1. 代码目前正在经历每个周期,当一个周期什么都没有的时候,它就会爆发。然而,假设第一次使用是向下4行,我只想循环开始,然后从开始的周期开始递增和中断
  2. 如何不仅检查app_id是否在当前行中,而且检查自开始使用期以来该行之前的所有其他行中

编辑

即使是当前的代码也没有循环通过。我得到:

AttributeError: ("'numpy.ndarray' object has no attribute 'isin'", u'occurred at index 0')

注意,打印出来的weeklyadoption是这样的:

[([array],[array]....)]

您尝试做的事情有几个问题:

  1. 循环中有一个return语句,这就是它退出循环的原因。

  2. 目前尚不清楚为什么将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及其持续时间的字典,你可以随心所欲地显示它们。

相关内容

最新更新