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

Python 如何遍历数组数组并检查项目的第一次和最后一次出现,python,arrays,pandas,nested,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, 6d02c9d74b662369

我有这样一个数组:

    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的数据帧:

unique_app_ids
0   g8m4lecv
1   uyhsx6lo
2   u9ue1zzo
3   kw06m3f5
4   wvqhq7d7
5   fucjx9ar
6   ede963a7c7b854938c1196bb83dc3a0924951055
7   ze4rr0vi
我想做的是,对于唯一的应用程序id中的每个应用程序id:

  • 根据数组中的周期查找其第一次出现
  • 如果出现这种情况,跟踪开始日期并将每周使用量增加一次
  • 转到下一个周期,如果app_id仍然存在,则增加1
  • 如果应用程序id不存在,则停止递增
  • 然后,我想在
    每周使用量
    的唯一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存储在数据帧中。相反,对我来说更有意义

  • 根据这些建议的实施情况,以下是我的解决方案:

    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
    

    这样你就有了一个独特ID及其持续时间的字典,你可以随心所欲地显示它们。

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

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

  • 不清楚为什么将2d数据存储在数组中,而将1d存储在数据帧中。相反,对我来说更有意义

  • 根据这些建议的实施情况,以下是我的解决方案:

    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
    

    这样你就有了一本独特ID及其持续时间的字典,你可以随心所欲地显示它们。

    嗨,这几乎让我达到了目的,谢谢!但是,len将始终计算数组的长度(始终为14,时段数)。而我想做的是计算从第一个“真”到第一个“假”的周期,例如
    Name:app\u id\u str,数据类型:bool 0 True 1 True 2 False 3 True 4 False 5 False 6 False 7 False 8 False 9 False 10 False 11 False 12 False 13 False
    是为某个应用程序ID返回的键值对之一。这里,返回的数字应该是2,因为它是
    True
    True
    然后是
    False
    。不是14号。嗨,我差点就到了,谢谢!但是,len将始终计算数组的长度(始终为14,时段数)。而我想做的是计算从第一个“真”到第一个“假”的周期,例如
    Name:app\u id\u str,数据类型:bool 0 True 1 True 2 False 3 True 4 False 5 False 6 False 7 False 8 False 9 False 10 False 11 False 12 False 13 False
    是为某个应用程序ID返回的键值对之一。这里,返回的数字应该是2,因为它是
    True
    True
    然后是
    False
    。不是14岁。