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

基于列的值将数据帧拆分为多个数据帧

  •  2
  • PPR  · 技术社区  · 3 年前

    df = pd.DataFrame({'A':[4,5,0,0,5,0,0,4],
                       'B':[7,8,0,0,4,0,0,0],
                       'C':[1,3,0,0,7,0,0,0]}, columns = ['A','B','C'])
    
    df["sum"] = df.sum(axis=1)
    df["Rolling_sum"] = df["sum"].rolling(2, min_periods=1).sum()
    

    生成的数据帧是:

        A   B   C   sum     Rolling_sum
    0   4   7   1   12  12.0
    1   5   8   3   16  28.0
    2   0   0   0   0   16.0
    3   0   0   0   0   0.0
    4   5   4   7   16  16.0
    5   0   0   0   0   16.0
    6   0   0   0   0   0.0
    7   4   0   0   4   4.0
    

    我想根据数据帧中出现的0将数据帧拆分为多个数据帧 Rolling_sum

    预期结果:

    数据帧1:

        A   B   C   sum     Rolling_sum
    0   4   7   1   12  12.0
    1   5   8   3   16  28.0
    2   0   0   0   0   16.0
    

        A   B   C   sum     Rolling_sum
    4   5   4   7   16  16.0
    5   0   0   0   0   16.0
    

    数据帧3:

        A   B   C   sum     Rolling_sum
    7   4   0   0   4   4.0
    

    2 回复  |  直到 3 年前
        1
  •  1
  •   BENY    3 年前

    你能行 cumsum groupby 子句

    d = {x : y for x , y in df.loc[df['Rolling_sum'].ne(0)].groupby(df['Rolling_sum'].eq(0).cumsum())}
    d
    Out[260]: 
    {0:    A  B  C  sum  Rolling_sum
     0  4  7  1   12         12.0
     1  5  8  3   16         28.0
     2  0  0  0    0         16.0, 1:    A  B  C  sum  Rolling_sum
     4  5  4  7   16         16.0
     5  0  0  0    0         16.0, 2:    A  B  C  sum  Rolling_sum
     7  4  0  0    4          4.0}
    
        2
  •  1
  •   tdy TheChimp    3 年前

    如果你想保留零, np.split 最简单的方法是:

    np.split(df, df.index[df['Rolling_sum'] == 0])
    
    # [   A  B  C  sum  Rolling_sum
    #  0  4  7  1   12         12.0
    #  1  5  8  3   16         28.0
    #  2  0  0  0    0         16.0,
    #
    #     A  B  C  sum  Rolling_sum
    #  3  0  0  0    0          0.0
    #  4  5  4  7   16         16.0
    #  5  0  0  0    0         16.0,
    #
    #     A  B  C  sum  Rolling_sum
    #  6  0  0  0    0          0.0
    #  7  4  0  0    4          4.0]
    

    cuts = df.index[df['Rolling_sum'] == 0] # [3, 6]
    cuts -= np.arange(len(cuts)) + 1        # [2, 4]
    np.split(df[df['Rolling_sum'] != 0], cuts)
    
    # [   A  B  C  sum  Rolling_sum
    #  0  4  7  1   12         12.0
    #  1  5  8  3   16         28.0,
    #
    #     A  B  C  sum  Rolling_sum
    #  2  0  0  0    0         16.0
    #  4  5  4  7   16         16.0,
    #
    #     A  B  C  sum  Rolling_sum
    #  5  0  0  0    0         16.0
    #  7  4  0  0    4          4.0]
    
    • 注意 df.index[df['Rolling_sum'] == 0] 假设您有一个默认范围索引
    • np.where(df['Rolling_sum'] == 0)[0]