我有一个这样的数据框,
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个值和后n个值将Y替换为N。在哪里可以更改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循环迭代来做到这一点,但是执行时间会很大。我正在寻找pythonic方式或熊猫快捷方式来有效地做到这一点。
答案 0 :(得分:1)
一个想法是将Series.interpolate
与limit
和limit_direction='both'
参数一起使用,但只能与数字一起使用,因此添加了map
,然后按掩码的映射值进行比较,最后设置loc
中的掩码值:
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