Python Pandas - равномерно распределяет числовые значения по ближайшим строкам - PullRequest
0 голосов
/ 08 мая 2018

Предположим, у меня есть такой набор данных:

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

Я хочу распределить значения как можно более равномерно между значениями их окружающих NaN с. Например, значение 12 должно учитывать их окружение NaNs и распределять их равномерно до тех пор, пока оно не коснется 2-го не NaN значения NaN с.

Например, 1-й 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 голосов
/ 08 мая 2018

Вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...