我有以下问题:
我的数据帧可能高达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
有人知道如何以快速,经济的方式做到这一点吗? 提前谢谢。
答案 0 :(得分:1)
使用shift
和loc
。使用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
答案 1 :(得分:1)
您可以使用ffill
和bfill
- 如果差距高于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