处理问题,我在
python中有以下数据帧
week hour week_hr store_code baskets
0 201616 106 201616106 505 0
1 201616 107 201616107 505 0
2 201616 108 201616108 505 0
3 201616 109 201616109 505 18
4 201616 110 201616110 505 0
5 201616 106 201616108 910 0
6 201616 107 201616106 910 0
7 201616 108 201616107 910 2
8 201616 109 201616108 910 3
9 201616 110 201616109 910 10
这里“小时”变量是“工作日”和“商店小时”的连续,例如工作日是星期一= 1,商店的小时是早上6点,然后是小时变量= 106,类似地,cal_hr是星期和小时的连续.我希望得到那些我认为没有篮子的趋势的行,即滚动3周的0篮子.在上面的例子中,我只会获得前3行.即对于商店505,存在从106到108的1个篮子的连续循环.但是我不想要行(4,5,6),因为即使连续3小时有0个篮子但是小时实际上不是连续的. 110 – > 106 – > 107.对于连续的时间,它们应该在106-110的范围内.基本上我想要所有商店和相应的行,如果它在任何给定的日子连续3小时有0个篮子.虚拟输出
week hour week_hr store_code baskets
0 201616 106 201616106 505 0
1 201616 107 201616107 505 0
2 201616 108 201616108 505 0
我可以使用pandas和循环在python中执行此操作吗?数据集需要按商店和小时排序.全新的python(
最佳答案 请执行下列操作:
>按store_code排序,week_hr
>按0过滤
>在df [‘week_hr’] [1:].values-df [‘week_hr’] [: – 1] .values之间存储减法,这样你就可以知道它们是否是连续的.
>现在,您可以根据需要为群组提供连续和过滤.
import numpy as np
import pandas as pd
# 1
t1 = df.sort_values(['store_code', 'week_hr'])
# 2
t2 = t1[t1['baskets'] == 0]
# 3
continuous = t2['week_hr'][1:].values-t2['week_hr'][:-1].values == 1
groups = np.cumsum(np.hstack([False, continuous==False]))
t2['groups'] = groups
# 4
t3 = t2.groupby(['store_code', 'groups'], as_index=False)['week_hr'].count()
t4 = t3[t3.week_hr > 2]
print pd.merge(t2, t4[['store_code', 'groups']])
没有必要循环!