解决问题,我在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和loop在python中执行此操作吗?数据集需要按商店和小时排序。完全是python的新手(
答案 0 :(得分:1)
执行以下操作:
现在,您可以根据需要为群组提供连续和过滤。
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']])
不需要循环!
答案 1 :(得分:0)
你可以解决:
代码:
t1 = df.sort_values(['store_code', 'week_hr'])
t2 = t1[t1['baskets'] == 0]
grouped = t2.groupby('store_code')['week_hr'].apply(lambda x: x.tolist())
for store_code, week_hrs in grouped.iteritems():
print(store_code, week_hrs)
# do something