【问题标题】:customize step in loop through pandas通过 pandas 自定义逐步循环
【发布时间】:2020-10-11 19:36:38
【问题描述】:

我知道这个问题被问过几次,但我无法理解答案或将其应用于我的案例。

我正在尝试遍历数据帧,并且对于每一行,如果 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 循环结合起来。

【问题讨论】:

  • 您能添加一个所需输出的示例吗?
  • 如果您执行代码的第一位(直到 print(arrays)),所需的输出与您获得的当前输出相同,但不是有 5 个每个 1 行的数组,而是例如:假设前 15 行在 A 列中有 10 个 1 和 5 个 0。整个块是第一个数组,我们开始计算下一行的新数组。一旦我们通过了 A = 1 的 10 行,我们就将中间的所有行放入第二个数组中,依此类推。我不知道该怎么做,所以我无法直观地向您展示它的样子抱歉

标签: python pandas numpy generator yield


【解决方案1】:

当我们使用pandas时,我们应该尽量不要做for循环,根据你的问题,我们可以使用groupby

arrays=[frame for _,frame in data.groupby(data.A.eq(1).cumsum().sub(1)//10)]

解释:

我们用 A 做cumsum 如果它是 1,那么我们会将数字相加,0 将保持与前一行相同的总和,// 这里是让 div 以 10 为单位分割数据帧,例如 10//10 将返回 1,而 20//10 将返回 2。

【讨论】:

  • 嗨@YOBEN_S 感谢您的回答。我以 pandas 为例进行简化,但实际上我使用了另一个名为 vaex 的库,它与 pandas 非常相似,但用于更大的数据帧(1 亿行 +)。它具有几乎相同的特征,但没有 cumsum 或 groupby 之类的功能,这就是我想使用 for 循环的原因
  • 我尝试将整个数据帧转换为 numpy 并使用 cumsum,但我的计算机无法将其全部存入内存。
猜你喜欢
  • 1970-01-01
  • 2015-02-23
  • 2021-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
相关资源
最近更新 更多