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

时间:2016-03-24 16:16:22

标签: python arrays pandas nested

我有一个像这样的数组:

    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. 如果app id不存在,则停止递增。
  5. 然后,我想在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是否在当前行中,但是在开始使用期后的该行之前的所有其他行中。
    3. 修改

      即使是当前的代码也没有循环。我明白了:

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

      请注意,weeklyadoption在打印时看起来像这样:

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

1 个答案:

答案 0 :(得分:0)

您要做的事情有几个问题:

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

  2. 目前还不清楚为什么将2d数据存储在数组中,1d存储在DataFrame中。相反的情况对我来说更有意义。

  3. 以下是基于这些建议实施的解决方案:

    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_ids字典及其持续时间,你可以随意显示它们。