正在处理一个问题,我在 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
这里的“hour”变量是“weekday”和“hour of shop”的组合,例如工作日是星期一=1,商店的营业时间是早上 6 点,那么 hour 变量 = 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']])
不需要循环!
我是一名优秀的程序员,十分优秀!