如何插入多行到一个有缺失值的PandasDF中?

but5z9lq  于 2023-02-02  发布在  其他
关注(0)|答案(2)|浏览(117)

我有一个DF:

df = pd.DataFrame({"A":[0,1,3,5,6], "B":['B0','B1','B3','B5','B6'], "C":['C0','C1','C3','C5','C6']})

我尝试在A列的连续序列中缺失数字的位置插入10个空行。对于这10行,A列、B列和C列的值分别是缺失的数字Nan和Nan,如下所示:

A   B   C
0   B0  C0
1   B1  C1
2   NaN NaN
2   NaN NaN
2   NaN NaN
2   NaN NaN
2   NaN NaN
2   NaN NaN
2   NaN NaN
2   NaN NaN
2   NaN NaN
2   NaN NaN
3   B3  C3
4   NaN NaN
4   NaN NaN
4   NaN NaN
4   NaN NaN
4   NaN NaN
4   NaN NaN
4   NaN NaN
4   NaN NaN
4   NaN NaN
4   NaN NaN
5   B5  C5
6   B6  C6

我尝试过index,但这只添加了1行:

df1 = df.merge(how='right', on='A', right = pd.DataFrame({'A':np.arange(df.iloc[0]['A'],
                                                                        df.iloc[-1]['A']+1)})).reset_index().drop(['index'], axis=1)

先谢了!

rqqzpn5f

rqqzpn5f1#

一种办法可以是:

  • 首先,使用df.set_index使列A成为索引。
  • 接下来,将range用于从0A(即6)的范围。
  • 现在,基于np.repeat应用df.reindex,我们使用循环将1输入到repeats参数中,以获取A中存在的所有值,并使用10来获取所有缺失的值。
  • 最后,链接df.reset_index
df.set_index('A', inplace=True)
rng = range(df.index.max()+1)
df = df.reindex(np.repeat(rng,[1 if i in df.index else 10 for i in rng]))\
    .reset_index(drop=False)

print(df)

    A    B    C
0   0   B0   C0
1   1   B1   C1
2   2  NaN  NaN
3   2  NaN  NaN
4   2  NaN  NaN
5   2  NaN  NaN
6   2  NaN  NaN
7   2  NaN  NaN
8   2  NaN  NaN
9   2  NaN  NaN
10  2  NaN  NaN
11  2  NaN  NaN
12  3   B3   C3
13  4  NaN  NaN
14  4  NaN  NaN
15  4  NaN  NaN
16  4  NaN  NaN
17  4  NaN  NaN
18  4  NaN  NaN
19  4  NaN  NaN
20  4  NaN  NaN
21  4  NaN  NaN
22  4  NaN  NaN
23  5   B5   C5
24  6   B6   C6
9q78igpj

9q78igpj2#

让我们试着对repeat大于1和concat的索引进行repeat运算:

N = 10
out = (pd.concat([df, df[['A']].loc[df.index.repeat(df['A'].diff(-1).lt(-1).mul(N-1))]])
         .sort_index(kind='stable')
      )

输出:

A    B    C
0  0   B0   C0
1  1   B1   C1
1  1  NaN  NaN
1  1  NaN  NaN
1  1  NaN  NaN
1  1  NaN  NaN
1  1  NaN  NaN
1  1  NaN  NaN
1  1  NaN  NaN
1  1  NaN  NaN
1  1  NaN  NaN
2  3   B3   C3
2  3  NaN  NaN
2  3  NaN  NaN
2  3  NaN  NaN
2  3  NaN  NaN
2  3  NaN  NaN
2  3  NaN  NaN
2  3  NaN  NaN
2  3  NaN  NaN
2  3  NaN  NaN
3  5   B5   C5
4  6   B6   C6

相关问题