首页 > 解决方案 > 通过 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 循环结合起来。

标签: pythonpandasnumpygeneratoryield

解决方案


当我们使用时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。


推荐阅读