如何在特定条件下添加0行



我有一个形式的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(,这是无法解决的。

使用pandas重新索引函数添加列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()

最新更新