Python (pandas):如果前一个值与下一个值相同则替换值

Python (pandas): replace value if previous value is same as next value

我有以下问题:

我有一个可能多达 600 万行的数据框。此数据框中的一列包含某些 ID。

ID
NaN
NaN
D1
D1
D1
NaN
D1
D1
NaN
NaN
NaN
NaN
D2
NaN
D2
NaN
NaN
NaN
NaN
D3
NaN
D3
NaN
D3
NaN
NaN

我想让 ID 之间包含的 NaN 与 ID 相同。因此上面的 df 应该变成:

ID
NaN
NaN
D1
D1
D1
D1
D1
D1
NaN
NaN
NaN
NaN
D2
D2
D2
NaN
NaN
NaN
NaN
D3
D3
D3
D3
D3
NaN
NaN

有人知道如何以快速、节省内存的方式执行此操作吗? 提前致谢。

使用 shiftloc。使用 shift(1)shift(-1)

比较上一个和下一个值
In [219]: df.loc[df.ID.shift(-1) == df.ID.shift(1), 'ID'] = df.ID.shift(1)

In [220]: df
Out[220]:
     ID
0   NaN
1   NaN
2    D1
3    D1
4    D1
5    D1
6    D1
7    D1
8   NaN
9   NaN
10  NaN
11  NaN
12   D2
13   D2
14   D2
15  NaN
16  NaN
17  NaN
18  NaN
19   D3
20   D3
21   D3
22   D3
23   D3
24  NaN
25  NaN

您可以使用 ffillbfill - 如果间隙高于 1:

,它也可以使用
f = df['ID'].ffill()
df['a'] = df['ID'].mask(f.eq(df['ID'].bfill()), f)
print (df)

     ID    a
0   NaN  NaN
1   NaN  NaN
2    D1   D1
3    D1   D1
4    D1   D1
5   NaN   D1
6    D1   D1
7    D1   D1
8   NaN  NaN
9   NaN  NaN
10  NaN  NaN
11  NaN  NaN
12   D2   D2
13  NaN   D2
14   D2   D2
15  NaN  NaN
16  NaN  NaN
17  NaN  NaN
18  NaN  NaN
19   D3   D3
20  NaN   D3
21   D3   D3
22  NaN   D3
23   D3   D3
24  NaN  NaN
25  NaN  NaN