【问题标题】:How to iterate through array of arrays pandas and check first and last occurrence of an item如何遍历数组熊猫数组并检查项目的第一次和最后一次出现
【发布时间】:2016-03-24 16:16:22
【问题描述】:

我有一个这样的数组:

    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 的唯一 ids 列中有一个列。

这是我目前所处的位置:

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]....)]

【问题讨论】:

    标签: python arrays pandas nested


    【解决方案1】:

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

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

    2. 不清楚为什么将二维数据存储在数组中,而将一维数据存储在 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 及其持续时间的字典,您可以随意显示它们。

    【讨论】:

    • 嗨,这几乎可以让我到达那里,谢谢!但是 len 将始终计算数组的长度(始终为 14,时间段数)。而我想做的是计算从第一个“真”到第一个“假”的时间段,例如Name: app_id_str, dtype: 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 是为 app_id 之一返回的键值对之一。在这里,返回的数字应该是 2,因为它是 TrueTrue,然后是 False。不是 14 岁。
    猜你喜欢
    • 2014-04-23
    • 1970-01-01
    • 2016-05-21
    • 2023-02-03
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    相关资源
    最近更新 更多