python通过dataframe的列进行迭代循环
在处理一个问题时,我有以下python数据帧python通过dataframe的列进行迭代循环,python,loops,python-3.x,pandas,dataframe,Python,Loops,Python 3.x,Pandas,Dataframe,在处理一个问题时,我有以下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
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
这里的“小时”变量是“工作日”和“营业时间”的concat,例如工作日是星期一=1,营业时间是早上6点,然后小时变量=106,同样地,cal_hr是周和小时的concat。我想得到那些我看到无篮趋势的行,即滚动3周的0篮。在上述情况下,我将只获得前3行。i、 e.对于505号仓库,从106到108有一个连续的1篮循环。但是我不想要行(4,5,6),因为即使连续3小时有0个篮子,但时间实际上不是连续的110->106->107。对于连续的小时数,它们应位于106-110的范围内。。基本上,我希望所有的商店和相应的行,如果它有0个篮子连续3小时在任何给定的一天。虚拟输出
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
我可以在python中使用熊猫和循环来完成这项工作吗?数据集需要按存储和小时进行排序。python的全新功能(您可以解决:
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']])
不需要循环!其他信息,我可以按以下方式循环,每小时循环一次,但对于接下来3小时的每小时检查,如果这些小时的篮数为0,则返回这些行,我建议首先获取一个列表,其中包含篮数为0的所有元素。(创建一个以store_代码为键的词汇表,以baskets=0为值的小时数列表。然后,在一行中找到与每个store_代码对应的列表中的任意三个或更多元素,最后使用“good hours&store_code”列表从数据库中获取完整数据。我将尝试做更详细的回答。谢谢。以上内容是否正确代码查找连续出现3次或更多次0的模式。应用程序的作用是什么?什么是tolist().iteritems是什么?你能详细解释一下吗。仍在学习python。这里是新手。非常感谢。上面的代码是否会查找3个或更多连续出现的0的模式。我是否可以为每个星期的天和小时创建索引。例如,对于201616周和106星期一的小时等。我可以创建一个具有索引的变量。因此,序列是来看看实际数字。假设201616106的值是1,那么201616107的值是2..等等..或者我甚至不需要这样做吗?你能详细解释一下吗?还在学习python。这里的新手我提供的代码将适用于你指定的数据帧,并将检测到同一个存储代码的3个或更多连续0,周。相关代码is
t4=t3[t3.week\u hr>2]
其中week\u hr是连续事件的计数(因此它过滤了两个以上的连续事件)。没有必要创建索引,week#hr将与groupby子句一起正常工作。您运行了吗?运行了吗?这非常有效,只是我无法理解#3之后的部分。hstack做什么?请您解释一下。非常感谢您的帮助,当您减去下一个当前值时,您的实际数组长度将为-1。例如:4,5,6,7将导致True,True,True,因此我必须hstack
将第一个元素添加为False才能添加长度相同的列。
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']])