python - 熊猫数据框插入缺少的行并填充上一行
问题描述
我有一个数据框如下:
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
id
列递增 1,因此缺少 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
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()
编辑:
对不起,我忘记了一个问题。
B
列将具有不同的值。
当DataFrame如下:
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
结果将是:
id A B
0 0 0 NaN
1 1 1 NaN
2 2 0 1.0
3 3 0 1.0
4 4 1 NaN
5 5 0 NaN
6 6 1 2.0
7 7 1 2.0
8 8 1 2.0
9 9 0 NaN
10 10 1 NaN
解决方案
更改是否保留原始 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
推荐阅读
- coronasdk - 我如何根据躲避的东西来提高我的分数
- python - 用最小误报找到最大覆盖率的 Python 脚本
- python - MySQL 准备好的语句在 Django 中产生错误,但在命令行中工作
- c++ - C++ 继承运算符=
- python - 如何解决 TypeError:'float' 对象不可调用
- c++ - 运行时 C++ 数组初始化问题
- c++ - 在函数内声明的 ifstream 对象在发布模式下不起作用
- java - m3u8 twitch 流,来自流的原始数据
- regex - notepad++ 找到某些行,改变它们(小写)
- python - 如何将文本输入中的值分配给 kivy 中的变量?