假设我有一个数据集,如:
> NaN NaN NaN 12 NaN NaN NaN NaN 10 NaN NaN NaN NaN 8 NaN 6 NaN
我希望在周围NaN
的值之间尽可能均匀地分配值。例如,值12应考虑其周围的NaNs
,并均匀分布它们,直到它触及第二个非NaN
值NaN
s。
例如,前12名应该只考虑他最接近的NaN。
> NaN NaN NaN 12 NaN NaN
输出应为:
2 2 2 2 2 (Distributed by the 12)
2 2 2 2 2 (Distributed by the 10)
2 2 2 2 (Distributed by the 8)
2 2 2 (Distributed by the 6)
> NaN NaN NaN 12 NaN NaN NaN NaN 10 NaN NaN NaN NaN 8 NaN 6 NaN
> 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
我最初考虑使用平滑器,例如Pandas中的插值功能。它不一定是无损的,这意味着我们可以失去或获得超过进展中的总和。是否有任何库可以执行此类分发而不是使用有损平滑器?
答案 0 :(得分:1)
您可以使用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