Есть ли простой подход Python для заполнения пропущенных значений nth до и nth после - PullRequest
1 голос
/ 01 июля 2019

У меня есть набор данных, где находятся средние значения для определенных периодов, и я хотел бы скопировать это значение в n-ые строки до и n-ые строки после. В моем случае этот период имеет 15 дней, то есть 7 дней после и 7 до средних значений . Как я могу это сделать?

Ну, я проверил много книг и веб-страниц, и есть много ссылок на fillna, однако ни одна из них не может решить мою проблему. Итак, я еще не пробовал код.

Вот мой набор данных

    DATE        RAIN    RR_MIDDLE   CONDITION_RR    CONDITION_PR    SEASON
 0  1983-07-22  0.000   0.00        Dry             Dry            Dry_Season
 1  1983-07-23  NaN      NaN         NaN            NaN            NaN
 2  1983-07-24  NaN      NaN         NaN            NaN            NaN
 .....................................................................
15  1983-08-06  0.000   0.00         Wet            Wet            Wet_Season

Я ожидал, что заполненные таблицы будут иметь одинаковые значения, например, средние значения за один сезон (период).

 DATE           RAIN    RR_MIDDLE   CONDITION_RR    CONDITION_PR    SEASON
0   1983-07-22  0.000   0.00        Dry             Dry            Dry_Season
1   1983-07-23  0.000   0.00        Dry             Dry            Dry_Season
2   1983-07-24  0.000   0.00        Dry             Dry            Dry_Season
3   1983-07-25  0.000   0.00        Dry             Dry            Dry_Season
4   1983-07-26  0.000   0.00        Dry             Dry            Dry_Season
5   1983-07-27  0.000   0.00        Dry             Dry            Dry_Season
6   1983-07-28  0.000   0.00        Dry             Dry            Dry_Season
7   1983-07-29  0.000   0.00        Dry             Dry            Dry_Season
8   1983-07-30  0.000   0.00        Wet             Wet            Wet_Season
9   1983-07-31  0.000   0.00        Wet             Wet            Wet_Season
10  1983-08-01  0.000   0.00        Wet             Wet            Wet_Season
11  1983-08-02  0.000   0.00        Wet             Wet            Wet_Season
12  1983-08-03  0.000   0.00        Wet             Wet            Wet_Season
13  1983-08-04  0.000   0.00        Wet             Wet            Wet_Season
14  1983-08-05  0.000   0.00        Wet             Wet            Wet_Season
15  1983-08-06  0.000   0.00        Wet             Wet            Wet_Season
16  1983-08-07  0.000   0.00        Wet             Wet            Wet_Season
And so on.....

1 Ответ

1 голос
/ 01 июля 2019

Если вам известно количество NaN с, которые нужно заполнить заранее, и оно одинаково во всем наборе данных, самое простое решение - аргумент limit для обоих заполнений:

df.ffill(limit=7).bfill(limit=7)

          DATE  RAIN  RR_MIDDLE CONDITION_RR CONDITION_PR      SEASON
0   1983-07-22   0.0        0.0          Dry          Dry  Dry_Season
1   1983-07-23   0.0        0.0          Dry          Dry  Dry_Season
2   1983-07-24   0.0        0.0          Dry          Dry  Dry_Season
3   1983-07-25   0.0        0.0          Dry          Dry  Dry_Season
4   1983-07-26   0.0        0.0          Dry          Dry  Dry_Season
5   1983-07-27   0.0        0.0          Dry          Dry  Dry_Season
6   1983-07-28   0.0        0.0          Dry          Dry  Dry_Season
7   1983-07-29   0.0        0.0          Dry          Dry  Dry_Season
8   1983-07-30   0.0        0.0          Wet          Wet  Wet_Season
9   1983-07-31   0.0        0.0          Wet          Wet  Wet_Season
10  1983-08-01   0.0        0.0          Wet          Wet  Wet_Season
11  1983-08-02   0.0        0.0          Wet          Wet  Wet_Season
12  1983-08-03   0.0        0.0          Wet          Wet  Wet_Season
13  1983-08-04   0.0        0.0          Wet          Wet  Wet_Season
14  1983-08-05   0.0        0.0          Wet          Wet  Wet_Season
15  1983-08-06   0.0        0.0          Wet          Wet  Wet_Season

В противном случае вам нужно interpolate с nearest; однако это работает только для числовых типов. Поэтому нам нужно преобразовать каждый столбец, интерполировать и преобразовать обратно.

str_cols = ['CONDITION_RR', 'CONDITION_PR', 'SEASON']

d = {}  # Holds mapping from str values to integers
for col in str_cols:
    u = df[col].dropna().unique()
    d[col] = dict(zip(u, range(len(u))))
    df[col] = df[col].map(d[col])  # Map unique values to integers

df = df.apply(pd.Series.interpolate, method='nearest')

# Map back
for col in str_cols:
    rev_d = {v:k for k,v in d[col].items()}
    df[col] = df[col].map(rev_d)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...