我有一个形式的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()