Python Pandas - 将数值均匀分布到最近的行

时间:2018-05-08 18:34:24

标签: python pandas numpy dataframe scipy

假设我有一个数据集,如:

> NaN NaN NaN 12 NaN NaN NaN NaN 10 NaN NaN NaN NaN 8 NaN 6 NaN

我希望在周围NaN的值之间尽可能均匀地分配值。例如,值12应考虑其周围的NaNs,并均匀分布它们,直到它触及第二个非NaNNaN 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中的插值功能。它不一定是无损的,这意味着我们可以失去或获得超过进展中的总和。是否有任何库可以执行此类分发而不是使用有损平滑器?

1 个答案:

答案 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