Fillna 在 Pandas 中具有向后和向前查看的状态

Tom*_*uza 4 python dataframe pandas fillna

我正在使用一个数据框,其中有一列包含多个 NaN,我想根据以下条件填充该 NaN:如果向后和向前最多 3 行,则有 2 个相等的值,然后用该值填充 NaN。

由于这可能不太清楚,下面举几个例子:

  col1                    
0 10    
1 10  
2 NaN
3 NaN
4 NaN
5 10
6 5
7 NaN
8 5
9 NaN
10 NaN
11 NaN
12 NaN
Run Code Online (Sandbox Code Playgroud)
  • 第 2 行中的值在向后的第 1 行中具有 10,在向前的第 3 行中具有 10。--> 填写10
  • 第 3 行中的值在向后 2 行中具有 10,在向前 2 行中具有 10。--> 填写10
  • 第 4 行中的值在 3 行中向后显示为 10,在向前的 1 行中显示为 10。--> 填写10
  • 第 7 行中的值有一个向后的 5 at 1 行和向前的 5 in 1 行。--> 填写5
  • 第 9 行中的值在向后 1 行处有 5,但在向前 3 行中没有 5。--> 那么,不填

然后,结果会是这样的:

  col1                    
0 10    
1 10  
2 10
3 10
4 10
5 10
6 5
7 5
8 5
9 NaN
10 NaN
11 NaN
12 NaN
Run Code Online (Sandbox Code Playgroud)

我可以使用任何功能来将此逻辑赋予 吗fillna

谢谢!!

jez*_*ael 5

您可以使用限制参数来比较前向填充和后向填充Series,使用 for bitwise AND 进行链掩码,&仅针对缺失值的行,并将其替换为前向填充列:

m1 = df['col1'].isna()
f = df['col1'].ffill(limit=3)
m2 = f.eq(df['col1'].bfill(limit=3))

df['col2'] = df['col1'].mask(m1 & m2, f)
print (df)
    col1  col2
0   10.0  10.0
1   10.0  10.0
2    NaN  10.0
3    NaN  10.0
4    NaN  10.0
5   10.0  10.0
6    5.0   5.0
7    NaN   5.0
8    5.0   5.0
9    NaN   NaN
10   NaN   NaN
11   NaN   NaN
12   NaN   NaN
Run Code Online (Sandbox Code Playgroud)