Вы можете использовать interpolate(method='nearest')
, ffill()
и bfill()
и, наконец, groupby()
.
Короткая версия:
>> series = pd.Series(x).interpolate(method='nearest').ffill().bfill()
>> series.groupby(series).apply(lambda k: k/len(k))
[2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 3.0, 3.0]
Чтобы проиллюстрировать, что происходит, создайте df
df = pd.DataFrame()
df["x"] = x
где x
- серия, которую вы дали. Сейчас:
>>> df["inter"] = df.x.interpolate(method='nearest').ffill().bfill()
>>> df["inter"] = df.groupby("inter").inter.apply(lambda k: k/len(k))
>>> df
x inter
0 NaN 2.0
1 NaN 2.0
2 NaN 2.0
3 12.0 2.0
4 NaN 2.0
5 NaN 2.0
6 NaN 2.0
7 NaN 2.0
8 10.0 2.0
9 NaN 2.0
10 NaN 2.0
11 NaN 2.0
12 NaN 2.0
13 8.0 2.0
14 NaN 2.0
15 6.0 3.0
16 NaN 3.0