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

时间:2016-07-22 18:17:31

标签: 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         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的新手(

2 个答案:

答案 0 :(得分:1)

执行以下操作:

  1. 按store_code排序,week_hr
  2. 过滤0
  3. 将减法存储在df [' week_hr'] [1:]。values-df [' week_hr'] [: - 1] .values之间,这样您就可以了解它们是连续的。
  4. 现在,您可以根据需要为群组提供连续和过滤。

    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']])
    
  5. 不需要循环!

答案 1 :(得分:0)

你可以解决:

  1. 按store_code排序,week_hr
  2. 过滤0
  3. 按商店代码分组
  4. 查找连续
  5. 代码:

    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