如何在某些条件下添加 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 行?的主要内容,如果未能解决你的问题,请参考以下文章