熊猫数据框插入缺少的行并填充上一行

时间:2020-07-02 04:00:28

标签: python pandas numpy dataframe

我有一个如下数据框:

import pandas as pd
import numpy as np

df=pd.DataFrame({'id':[0,1,2,4,5],
                'A':[0,1,0,1,0],
                'B':[None,None,1,None,None]})
   id  A    B
0   0  0  NaN
1   1  1  NaN
2   2  0  1.0
3   4  1  NaN
4   5  0  NaN

请注意,B列中的绝大多数价值为NaN

id列增加1,因此id 2和4之间缺少一行。
除了id列之外,需要插入的缺失行与上一行相同。

例如,结果是

    id  A   B
0   0   0.0 NaN
1   1   1.0 NaN
2   2   0.0 1.0
3   3   0.0 1.0 <-add row here
4   4   1.0 NaN
5   5   0.0 NaN

我可以在A列上执行此操作,但是我不知道如何处理B列,因为ffill将填充1.0在行{{1} }和4,这是不正确的

5

编辑:
抱歉,我忘了一个命令。
step=1 idx=np.arange(df['id'].min(), df['id'].max() + step, step) df=df.set_index('id').reindex(idx).reset_index() df['A']=df["A"].ffill() 列将具有不同的值。
当DataFrame如下时:

B

结果将是:

   id  A    B
0   0  0  NaN
1   1  1  NaN
2   2  0  1.0
3   4  1  NaN
4   5  0  NaN
5   6  1  2.0
6   9  0  NaN
7   10 1  NaN

3 个答案:

答案 0 :(得分:3)

所做的更改是否保留原始ID,并使用update isin

s=df.id.copy() #change 1
step=1
idx=np.arange(df['id'].min(), df['id'].max() + step, step)
df=df.set_index('id').reindex(idx).reset_index()
df['A']=df["A"].ffill()

df.B.update(df.B.ffill().mask(df.id.isin(s))) # change two
df
   id    A    B
0   0  0.0  NaN
1   1  1.0  NaN
2   2  0.0  1.0
3   3  0.0  1.0
4   4  1.0  NaN
5   5  0.0  NaN

答案 1 :(得分:1)

如果我理解正确,这里有一些示例代码。

new_df = pd.DataFrame({
    'new_id': [i for i in range(df['id'].max() + 1)],
})

df = df.merge(new_df, how='outer', left_on='id', right_on='new_id')
df = df.sort_values('new_id')

df = df.ffill()

df = df.drop(columns='id')

df
    A   B   new_id
0   0.0 NaN 0
1   1.0 NaN 1
2   0.0 1.0 2
5   0.0 1.0 3
3   1.0 1.0 4
4   0.0 1.0 5

答案 2 :(得分:1)

尝试一下

df=pd.DataFrame({'id':[0,1,2,4,5],
                'A':[0,1,0,1,0],
                'B':[None,None,1,None,None]})


missingid = list(set(range(df.id.min(),df.id.max())) - set(df.id.tolist()))
for i in missingid:
    df.loc[len(df)] = np.concatenate((np.array([i]),df[df.id==i-1][["A","B"]].values[0]))

df=df.sort_values("id").reset_index(drop=True)

输出

    id    A    B
0  0.0  0.0  NaN
1  1.0  1.0  NaN
2  2.0  0.0  1.0
3  3.0  0.0  1.0
4  4.0  1.0  NaN
5  5.0  0.0  NaN