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
有人知道如何以快速、节省内存的方式执行此操作吗?
提前致谢。
使用 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
您可以使用 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
我有以下问题:
我有一个可能多达 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
有人知道如何以快速、节省内存的方式执行此操作吗? 提前致谢。
使用 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
您可以使用 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