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:
每周使用量
的唯一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
是数组的数组。但是,我没有测试代码,因为我在思考以下问题时遇到了困难:
AttributeError: ("'numpy.ndarray' object has no attribute 'isin'", u'occurred at index 0')
请注意,weeklyadoption
打印出来时如下所示:
[([array],[array]....)]
您尝试执行的操作有几个问题:
return
语句,这就是它退出循环的原因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
语句,这就是它退出循环的原因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岁。