python迭代循环通过数据帧的列

处理问题,我在
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']])

没有必要循环!

点赞