如何在某些条件下添加 0 行?

Posted

技术标签:

【中文标题】如何在某些条件下添加 0 行?【英文标题】:How do I add 0 rows under certain conditions? 【发布时间】: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),就无法解决了。

【问题讨论】:

【参考方案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) 如果我的代码解决了你的问题,你能把它标记为答案 感谢您提供的代码,我解决了问题。

以上是关于如何在某些条件下添加 0 行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在某些条件下识别邻居

如何在不进行分组的情况下在Oracle中向SQL结果添加虚拟行

如何在Python中对满足某些条件的行进行子集[重复]

如何仅在某些行上显示图像按钮

在甲骨文条件下增加价值

如何在 Flutter 中的某些布尔条件下启用按钮?