Python 如何仅当端点具有相同的值且限制为最多出现次数时才填补数据空白?
我在这里寻找了很多答案,但都没有找到。理想的结果是,当末端值相等时,仅填充间隙,长度限制为4个值: 我的数据集: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
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