【问题标题】:How do I add 0 rows under certain conditions?如何在某些条件下添加 0 行?
【发布时间】:2022-01-02 10:42:34
【问题描述】:

我有一个pandas.DataFrame 的表单

df=

  index   ID     A       B
    
    0      a     0       111
    1      a     1       111
    2      a     2       111
    3      b     3       111
    4      c     0       111
    5      c     2       111
    6      c     3       111
    7      d     0       111
    8      d     1       111
    9      e     2       111
    10     f     1       111
    11     f     2       111
    12     f     3       111
    13     g     1       111
    14     g     2       111

我想创建一个数据框,其中 A 列重复 0、1、2、3。但是数据中缺少一些东西。我试图通过附加行值来用 0 填充空白。这是我的预期结果:

   index   ID     A       B
    
    0      a     0       111
    1      a     1       111
    2      a     2       111
    3      a     3       0
    4      b     0       0
    5      b     1       0
    6      b     2       0
    7      b     3       111
    8      c     0       111
    9      c     1       0
    10     c     2       111
    11     c     3       111
    12     d     0       111
    13     d     1       111
    14     d     2       0
    15     d     3       0
    16     e     0       0
    17     e     1       0
    18     e     2       111
    19     e     3       0
    20     f     0       0
    21     f     1       111
    22     f     2       111
    23     f     3       111
    24     g     0       0
    25     g     1       111
    26     g     2       111
    27     g     3       0

或者您可以执行以下操作。也许会更容易。

  index   ID     A       B
    
    0      a     0       111
    1      a     1       111
    2      a     2       111
    3      0     3       0
    4      0     0       0
    5      0     1       0
    6      0     2       0
    7      b     3       111
    8      c     0       111
    9      0     1       0
    10     c     2       111
    11     c     3       111
    12     d     0       111
    13     d     1       111
    14     0     2       0
    15     0     3       0
    16     0     0       0
    17     0     1       0
    18     e     2       111
    19     0     3       0
    20     0     0       0
    21     f     1       111
    22     f     2       111
    23     f     3       111
    24     0     0       0
    25     g     1       111
    26     g     2       111
    27     0     3       0

我怎样才能做到这一点?

太难了。我该怎么办?。我在从大数变为小数时使用.diff().le(0),例如从ID(b) 变为ID(c)。但是当从小数变成大数时,比如从ID(a)变成ID(b)或者从ID(d)变成ID(e),就无法解决了。

【问题讨论】:

    标签: python pandas sorting


    【解决方案1】:

    使用pandas reindex函数在A列中添加缺失数据的行

    试试这个:

    1.

    gr = df.groupby('ID')
    
    
    def handle(sub):
        reidx = sub.set_index('A').reindex(range(4))\
            .reset_index().iloc[:, [1, 0, 2]]
        res = reidx.assign(
            ID=reidx.ID.ffill().bfill(),
            B=reidx.B.fillna(0))
        return res
    
    
    gr.apply(handle).reset_index(drop=True)
    >>>
       ID   A   B
    0   a   0   111.0
    1   a   1   111.0
    2   a   2   111.0
    3   a   3   0.0
    4   b   0   0.0
    5   b   1   0.0
    6   b   2   0.0
    7   b   3   111.0
    8   c   0   111.0
    9   c   1   0.0
    10  c   2   111.0
    11  c   3   111.0
    12  d   0   111.0
    13  d   1   111.0
    14  d   2   0.0
    15  d   3   0.0
    16  e   0   0.0
    17  e   1   0.0
    18  e   2   111.0
    19  e   3   0.0
    20  f   0   0.0
    21  f   1   111.0
    22  f   2   111.0
    23  f   3   111.0
    24  g   0   0.0
    25  g   1   111.0
    26  g   2   111.0
    27  g   3   0.0
    
    gr = df.groupby('ID')
    
    
    def handle(sub):
        reidx = sub.set_index('A').reindex(range(4))\
            .reset_index().iloc[:, [1, 0, 2]].fillna(0)
        return reidx
    
    
    gr.apply(handle).reset_index(drop=True)
    >>>
        D   A   B
    0   a   0   111.0
    1   a   1   111.0
    2   a   2   111.0
    3   0   3   0.0
    4   0   0   0.0
    5   0   1   0.0
    6   0   2   0.0
    7   b   3   111.0
    8   c   0   111.0
    9   0   1   0.0
    10  c   2   111.0
    11  c   3   111.0
    12  d   0   111.0
    13  d   1   111.0
    14  0   2   0.0
    15  0   3   0.0
    16  0   0   0.0
    17  0   1   0.0
    18  e   2   111.0
    19  0   3   0.0
    20  0   0   0.0
    21  f   1   111.0
    22  f   2   111.0
    23  f   3   111.0
    24  0   0   0.0
    25  g   1   111.0
    26  g   2   111.0
    27  0   3   0.0
    

    或者你可以试试这个:

    df.set_index(['ID', 'A']).unstack().stack(dropna=False).fillna(0).reset_index()
    

    【讨论】:

    • 感谢您的好回答。但我举了一个非常简单的例子。我会给你一个详细的解释。 1.实际上有几千万个ID。 (不仅从 a 到 g) 2. A 列包含 0~63,而不是 0~3。这种情况我该怎么办?
    • 你只需要将range(4)改为range(64)
    • 如果我的代码解决了你的问题,你能把它标记为答案
    • 感谢您提供的代码,我解决了问题。
    猜你喜欢
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多