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遍历数据框列的主要内容,如果未能解决你的问题,请参考以下文章