Tengo un conjunto de datos donde hay valores medios para ciertos períodos y me gustaría copiar este valor en las enésimas filas antes y enésimas filas después. En mi caso, el período tiene 15 días, por lo que 7 días después y 7 antes de los valores medios . ¿Cómo puedo hacerlo?

Bueno, he revisado muchos libros y páginas web y hay muchas referencias para fillna, sin embargo, ninguno de estos puede resolver mi problema. Por lo tanto, todavía no he probado ningún código.

Ahí está mi conjunto de datos

    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

Esperaba tablas llenas de los mismos valores como el medio en una temporada (período).

 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
Lukáš Tůma 1 jul. 2019 a las 22:15

1 respuesta

La mejor respuesta

Si conoce de antemano el número de NaN s que debe completar y es el mismo en todo su conjunto de datos, la solución más simple es el argumento limit de ambos rellenos:

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

De lo contrario, debe interpolate con nearest; sin embargo, eso solo funciona para tipos numéricos. Por lo tanto, necesitamos transformar cada columna, interpolar y transformar de nuevo.

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)
1
ALollz 1 jul. 2019 a las 19:56