python遍历数据框列

Posted

技术标签:

【中文标题】python遍历数据框列【英文标题】:python Iterative loop through columns of dataframe 【发布时间】:2016-11-26 17:49:56 【问题描述】:

解决一个问题,我在 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”的组合,例如工作日是 monday=1,hour of shop 是早上 6 点,那么 hour 变量 = 106,类似地 cal_hr 是 week 和 hour 的 concat。我想得到那些我看到没有篮子趋势的行,即 滚动 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

我可以在 python 中使用 pandas 和循环来做到这一点吗?数据集需要按商店和小时排序。对 python 完全陌生(

【问题讨论】:

附加信息,我可以按以下方式循环吗,每小时循环一次,但每小时检查接下来的 3 小时,如果这些小时内的篮子是 0 ,则返回这些行, 我建议首先获取一个包含所有具有购物篮 = 0 的元素的列表。(创建一个以 store_code 作为键的字典,并以购物篮 = 0 作为值的小时列表。然后,找到任何三个或每个store_code对应的list中的元素更多,最后使用'good hours&store_code'的list从db中获取完整数据。我会尝试做更详细的回答 【参考方案1】:

执行以下操作:

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

无需循环!

【讨论】:

非常感谢。上面的代码是否会查找 3 个或更多连续出现 0 的模式。我可以为每个工作日和每个小时创建一个索引。例子 。对于 201616 周和星期一 106 小时等。我可以创建一个具有索引的变量。所以序列成为实际数字。说 201616106 的值为 1 然后 201616107 的值为 2..等等..或者我什至不需要这样做?你能详细解释一下吗。还在学习python。新手来了 我提供的代码将适用于您指定的数据帧,并且会检测到相同 store_code、week_hr 的 3 个或更多连续 0。相关代码是t4 = t3[t3.week_hr > 2],其中 week_hr 是连续出现的计数(因此它过滤了超过 2 次连续出现)。无需创建索引,week_hr 可以与 groupby 子句一起正常工作。你跑了吗?成功了吗? 这很好用,只是我无法理解 #3 之后的部分。 hstack 是做什么的?你能解释一下吗。非常感谢您的帮助 当您减去 next-current 时,您的实际数组将具有 -1 长度。例如:4,5,6,7 将导致 True,True,True,所以我必须 hstack 将第一个元素添加为 False 才能添加具有相同长度的列。【参考方案2】:

你可以解决:

    按 store_code、week_hr 排序 按 0 过滤 按 store_code 分组 连续查找

代码:

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

【讨论】:

非常感谢cuong。上面的代码会寻找 3 个或更多连续出现 0 的模式。 apply 有什么作用?什么是tolist()。什么是iteritems?你能详细解释一下吗。还在学习python。新手在这里。

以上是关于python遍历数据框列的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark:如何遍历数据框列?

循环遍历数据框列后如何附加列表?

遍历 pyspark 数据框列

循环遍历 pandas 数据框列中的列表元素以在新列中返回列表

如何有条件地转换熊猫数据框列

计算数据框列中真/假的出现次数