python - 通过 pandas 自定义 step in loop
问题描述
我知道这个问题被问了几次,但我无法理解答案或将它们应用于我的案例。
我正在尝试遍历数据帧,并且对于每一行,如果 A 列有 1,则将 1 添加到计数器,如果它有 0,则不要计算计数器中的行(但不要跳过它)。当计数器达到 10 时,取出所有行并将它们放入一个数组中并重新启动计数器。经过一番搜索,似乎生成器可以解决问题,但我对它们有点麻烦。到目前为止,由于 SO 社区的帮助,我有这样的事情!
data = pd.DataFrame(np.random.randint(0,50,size=(50, 4)), columns=list('ABCD'))
data['C'] = np.random.randint(2, size=50)
data
counter = 0
chunk = 10
arrays = []
for x in range(0, len(data), chunk):
array = data.iloc[x: x+chunk]
arrays.append(array)
print(array)
这个想法看起来像这样:
while counter <= 10:
if data['A'] == 1:
counter += 1
yield counter
if counter > 10:
counter = 0
但我不知道如何将这个伪代码与我当前的 for 循环结合起来。
解决方案
当我们使用时pandas
,我们应该尽量不做for循环,根据你的问题,我们可以使用groupby
arrays=[frame for _,frame in data.groupby(data.A.eq(1).cumsum().sub(1)//10)]
解释 :
我们cumsum
用 A 如果它是 1,那么我们将把数字加起来,0 将保持与前一行相同的总和,//
这里是让 div 以 10 为步长分割数据帧,例如 10//10 将返回 1和 20//10 将返回 2。
推荐阅读
- python - 我可以通过仅传递 ec2-instance 的私有 IP 来使用 boto 3 获取给定实例的区域值吗
- repository - 是否可以在 NXRM 中为 helm 托管 repo 创建内容选择器
- gem5 - 如何在 gem5-20 中使用 m5 将它与我自己的 C++ 程序链接?
- c# - 基于端点的路由.net core 3.1中缺少端点
- java - 将 JSON 数组添加到现有的 JSON 文件
- eclipse - 无法在 Eclipse 中到处安装团队资源管理器?
- r - 创建游戏模型的 r 数据框
- python - 如何将代码修改为所需的格式?
- python - 如何填充等高线图掩码并将数据保留在等高线内并将其余部分涂黑
- javascript - 无法遍历 Javascript 对象