Python 如何用特定的panda列值替换n个顶部和底部值

Python 如何用特定的panda列值替换n个顶部和底部值,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个这样的数据框 col1 col2 1 N 2 N 3 N 4 Y 5 N 6 N 7 Y 8 N 9 N 10 N 我想用这个条件从上面的数据框创建另一个数据框,如果在col2中找到Y,用col2的顶部和底部N值替换Y。我可以改变n的值 例如,如果n的值为1,则所需的输出将为 col1 col2 1 N 2

我有一个这样的数据框

col1    col2
  1      N
  2      N
  3      N
  4      Y
  5      N
  6      N
  7      Y
  8      N
  9      N
  10     N
我想用这个条件从上面的数据框创建另一个数据框,如果在col2中找到Y,用col2的顶部和底部N值替换Y。我可以改变n的值

例如,如果n的值为1,则所需的输出将为

 col1    col2
  1      N
  2      N
  3      Y
  4      Y
  5      Y
  6      Y
  7      Y
  8      Y
  9      N
  10     N
我可以使用for循环迭代来完成,但是执行时间会很长。我正在寻找肾盂的方式或快捷方式来有效地做到这一点

一个想法是使用
限制
限制
参数,但只使用数值,因此添加了
映射
,然后通过掩码的映射值进行比较,最后通过
位置设置掩码的值:

N = 1
m = df['col2'].map({'Y':1}).interpolate(limit=N, limit_direction='both').eq(1)
df.loc[m, 'col2'] = 'Y'
#alternative
#df['col2'] = df['col2'].mask(m, 'Y')
print (df)
   col1 col2
0     1    N
1     2    N
2     3    Y
3     4    Y
4     5    Y
5     6    Y
6     7    Y
7     8    Y
8     9    N
9    10    N
另一种解决方案是使用
ffill
bfill
向前和向后填充缺少的值,使用
limit
参数:

N = 2
s = df['col2'].mask(df['col2'] == 'N')
df['col2'] = s.ffill(limit=N).fillna(s.bfill(limit=N)).fillna(df['col2'])
print (df)
   col1 col2
0     1    N
1     2    Y
2     3    Y
3     4    Y
4     5    Y
5     6    Y
6     7    Y
7     8    Y
8     9    Y
9    10    N