Python 如何仅当端点具有相同的值且限制为最多出现次数时才填补数据空白?

Python 如何仅当端点具有相同的值且限制为最多出现次数时才填补数据空白?,python,pandas,dataframe,fillna,Python,Pandas,Dataframe,Fillna,我在这里寻找了很多答案,但都没有找到。理想的结果是,当末端值相等时,仅填充间隙,长度限制为4个值: 我的数据集: 0 NaN 1 NaN 2 NaN 3 5.0 4 5.0 5 NaN 6 NaN 7 5.0 8 6.0 9 NaN 10 NaN 11 NaN 12 NaN 13 NaN 14 NaN 15 5.0 16 5.0 17 NaN 18 NaN 19

我在这里寻找了很多答案,但都没有找到。理想的结果是,当末端值相等时,仅填充间隙,长度限制为4个值:

我的数据集:

0     NaN
1     NaN
2     NaN
3     5.0
4     5.0
5     NaN
6     NaN
7     5.0
8     6.0
9     NaN
10    NaN
11    NaN
12    NaN
13    NaN
14    NaN
15    5.0
16    5.0
17    NaN
18    NaN
19    6.0
20    6.0
21    NaN
22    NaN
23    NaN
24    NaN
25    5.0
26    NaN
27    NaN
28    NaN
29    NaN
30    NaN
31    NaN
32    NaN
33    5.0
34    NaN
35    NaN
所需结果(仅在末端值相等时填充间隙,仅限长度为4的间隙):


应该是这样的:

def extremities(arr):
nones = [i for i,x in enumerate(arr) if x == None]
not_nones = [i for i,x in enumerate(arr) if x != None]
for i in nones:
    try:
        start = [x for x in not_nones if x < i][-1]
        finish = [x for x in not_nones if x > i][0]
    except:
        continue
    if arr[start] == arr[finish] and i - start < 5:
        arr[i] = arr[start]
return arr
def四肢(arr):
nones=[i表示i,如果x==None,则枚举(arr)中的x为i]
not_nones=[i代表i,x在枚举(arr)中,如果x!=None]
对于我来说,我不是:
尝试:
开始=[x表示x,如果xi,则不可用][0]
除:
持续
如果arr[start]==arr[finish]且i-start<5:
arr[i]=arr[start]
返回arr
编辑:


抱歉,我忘了它的长度限制为4个值。我编辑了代码。

我们可以使用布尔掩蔽和
cumsum
来识别以相同值开始和结束的
NaN
值块,然后将这些块上的列分组并向前填充
4

s = df['col']
m = s.notna()
s.mask(s[m] != s[m].shift(-1)).groupby(m.cumsum()).ffill(limit=4).fillna(s)


这太美了!!!简单、快速、有效!“s.mask(s[m]!=s[m].shift(-1))”的想法真的把这个问题变成了一个简单的解决方案。你是怎么想到这个主意的??)@很高兴我能帮上忙。关于这个想法,它提出了很多经验和解决问题的方法:P
s = df['col']
m = s.notna()
s.mask(s[m] != s[m].shift(-1)).groupby(m.cumsum()).ffill(limit=4).fillna(s)
0     NaN
1     NaN
2     NaN
3     5.0
4     5.0
5     5.0
6     5.0
7     5.0
8     6.0
9     NaN
10    NaN
11    NaN
12    NaN
13    NaN
14    NaN
15    5.0
16    5.0
17    NaN
18    NaN
19    6.0
20    6.0
21    NaN
22    NaN
23    NaN
24    NaN
25    5.0
26    5.0
27    5.0
28    5.0
29    5.0
30    NaN
31    NaN
32    NaN
33    5.0
34    NaN
35    NaN
Name: col, dtype: float64