#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