代码之家  ›  专栏  ›  技术社区  ›  RustyShackleford

如何通过列中的值之和不超过X将数据帧分块到列表中?

  •  0
  • RustyShackleford  · 技术社区  · 3 年前

    我有一个df,它看起来像这样,有很多行:

    col1  count
     a     80
     b     100
     c     20
    

    我需要通过count列的总和对这个数据帧进行分块,总和不超过100。因此,块代码创建列表中df的块应该是这样的,其中每个块由不超过100的计数列的总和决定。同样在我的情况下,只要列值相同,索引就无关紧要:

    lst_df = [chunk1, chunk2]
    
    Chunk1 = 
        col1  count
         a     80
         c     20
    
    Chunk2 = 
        col1  count
         b     100
    

    我可以按行计数进行分块,但不知道如何按列中值的总和进行分块并重复。

    n = 25  #chunk row size
    list_df = [df[i:i+n] for i in range(0,df.shape[0],n)]
    
    1 回复  |  直到 3 年前
        1
  •  1
  •   wwnde    3 年前

    这个问题有点含糊。如果连续行的总和超过一百,会发生什么情况?说我有34、70、100?我该怎么处理?此外,如何确定list_df中的元素?。。。手动?

    假设它的总和总是一百,那么就这样处理吧

    由于索引无关紧要,

    1. 根据计数对df进行排序。
    2. 逐行累计求和。
    3. 使用模数检查面积是否达到100的倍数,并转换为整数
    4. 将以上3项相加以形成组
    5. 使用列表理解按4中的组和子集对df进行分组
    6. 使用您的list_df名称创建子集的dict
    7. 通过dict_get方法显示df

    下面的代码

    lst_df = ['chunk1', 'chunk2']
    
    dfs = dict(zip(lst_df,[x for _, x in df.groupby((df.sort_values('count', ascending=False)['count'].expanding(1).sum()%100==0).astype(int).cumsum())]))
    
    dfs.get('chunk1')