Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python通过dataframe的列进行迭代循环_Python_Loops_Python 3.x_Pandas_Dataframe - Fatal编程技术网

python通过dataframe的列进行迭代循环

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

在处理一个问题时,我有以下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
这里的“小时”变量是“工作日”和“营业时间”的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的全新功能(

您可以解决:

  • 按门店代码、周/小时排序
  • 按0筛选
  • 按门店代码分组
  • 找到连续的
  • 代码:

    请执行以下操作:

  • 按门店代码、周/小时排序
  • 按0筛选
  • 存储df['week\u hr'][1:]之间的减法。值df['week\u hr'][:-1]。这样您就可以知道它们是否是连续的
  • 现在,您可以根据需要将组分配给continuous和filter

    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']])