как использовать pandas fillna NaN с отрицательным значением следующей строки

#python #pandas #fillna

#python #pandas #fillna

Вопрос:

У меня есть таблица ежедневных (временных рядов) дождей в городах. как использовать pandas fillna NaN с отрицательным значением дождя следующего дня в том же городе? Спасибо.

 import pandas as pd
import numpy as np
rain_before = pd.DataFrame({'date':Date*2,'city':list('aaaaabbbbb'),'rain':[6,np.nan,1,np.nan,np.nan,4,np.nan,np.nan,8,np.nan]})

# after fillna, the table should look like this. 
rain_after_fillna = pd.DataFrame({'date':Date*2,'city':list('aaaaabbbbb'),'rain':[6,-1,1,np.nan,np.nan,4,np.nan,-8,8,np.nan]})


 

Ответ №1:

Вы можете сдвинуть и заполнить

 rain_before['rain'].fillna(rain_before.groupby('city')['rain']
                           .transform(lambda x: -x.shift(-1)))

0    6.0
1   -1.0
2    1.0
3   NaN 
4   NaN 
5    4.0
6   NaN 
7   -8.0
8    8.0
9   NaN 
Name: rain, dtype: float64
 

Комментарии:

1. Спасибо. это работает! как изменить коды, если «дождь» равен 0, а не NaN. Я хочу получить ту же таблицу. замените 0 на отрицательное значение следующего следующего значения. rain_before = pd.DataFrame({'date':Date*2,'city':list('aaaaabbbbb'),'rain':[6,0,1,0,0,4,0,0,8,0]})

2. на какое ожидаемое значение следует заменить, если следующее правильное значение равно 0, -0?

3. 0 или -0. -0 в любом случае равно 0. так что это не имеет значения.

4. Вы можете использовать логическую индексацию и сдвиг, как в ответе rain_after_fill_na.loc[rain_before['rain']==0, 'rain'] = -rain_before['rain'].shift(-1)

Ответ №2:

Используя ряд shift(-1)*-1 . Нет образца набора данных, поэтому я синтезировал и не включил город. Тот же подход можно использовать для city, необходимо учитывать порядок сортировки

 import datetime as dt
import random
df = pd.DataFrame({"Date":pd.date_range(dt.date(2021,1,1), dt.date(2021,1,10))
             ,"rainfall":[i*random.randint(0,1) for i in range(10)]}).replace({0:np.nan})

df["rainfall_nan"] = df["rainfall"].fillna(df["rainfall"].shift(-1)*-1)
 

вывод

       Date  rainfall  rainfall_nan
2021-01-01       NaN          -1.0
2021-01-02       1.0           1.0
2021-01-03       2.0           2.0
2021-01-04       3.0           3.0
2021-01-05       NaN          -5.0
2021-01-06       5.0           5.0
2021-01-07       6.0           6.0
2021-01-08       7.0           7.0
2021-01-09       NaN          -9.0
2021-01-10       9.0           9.0