Python(pandas):如果先前的值与下一个值

时间:2017-07-28 11:20:02

标签: python pandas outliers

我有以下问题:

我的数据帧可能高达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

有人知道如何以快速,经济的方式做到这一点吗? 提前谢谢。

2 个答案:

答案 0 :(得分:1)

使用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

答案 1 :(得分:1)

您可以使用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