Как отключить вычисление с помощью nans, пока pandas resample (). Mean () и resample (). Sum ()?

Мне нужно рассчитать среднегодовое значение на основе ежемесячных данных. Если в моих ежемесячных данных есть значение nan, я хочу, чтобы весь год также был nan.

Это мой код на данный момент:

station_data = pd.read_csv(station_data_files[0], sep=';', header=0)
station_data = station_data.replace(-999, np.nan)
station_data = station_data.set_index("MESS_DATUM_BEGINN") # it is a row with time dates

station_data_anual = pd.DataFrame()
station_data_anual["Y_TT"] = station_data["MO_TT"].resample("A").mean()
station_data_anual["Y_RR"] = station_data["MO_RR"].resample("A").sum()

Проблема в том, что он игнорирует nans. Что означает, например, что station_data_anual["Y_RR"] значения слишком низкие. Для лет, когда у меня в качестве ежемесячных значений использовалось только nans, он возвращает 0.

Примечание. Есть несколько вопросов, похожих на мой, но они мне не помогли. Примечание: Python

некоторые пояснения:

Входные данные:

station_data
Out[235]: 
                   STATIONS_ID MESS_DATUM_ENDE  QN_4  ...  MO_RR  MX_RS  eor
MESS_DATUM_BEGINN                                     ...                   
1981-01-01               403.0      1981-01-31  10.0  ...   51.5   10.0  eor
1981-02-01               403.0      1981-02-28  10.0  ...   23.8    5.4  eor
1981-03-01               403.0      1981-03-31  10.0  ...  116.5   28.0  eor
1981-04-01               403.0      1981-04-30  10.0  ...   24.1    9.5  eor
1981-05-01               403.0      1981-05-31  10.0  ...   29.4    8.4  eor
                       ...             ...   ...  ...    ...    ...  ...
2010-08-01               403.0      2010-08-31  10.0  ...    NaN   29.1  eor
2010-09-01               403.0      2010-09-30  10.0  ...    NaN   29.8  eor
2010-10-01               403.0      2010-10-31  10.0  ...    NaN    5.5  eor
2010-11-01               403.0      2010-11-30  10.0  ...    NaN   17.5  eor
2010-12-01               403.0      2010-12-31  10.0  ...    NaN    8.2  eor

[360 rows x 16 columns]

присмотритесь:

station_data["MO_RR"][276:288]
Out[242]: 
MESS_DATUM_BEGINN
2004-01-01    66.3
2004-02-01     NaN
2004-03-01     NaN
2004-04-01     NaN
2004-05-01     NaN
2004-06-01     NaN
2004-07-01     NaN
2004-08-01     NaN
2004-09-01     NaN
2004-10-01     NaN
2004-11-01     NaN
2004-12-01     NaN
Name: MO_RR, dtype: float64

Выходные данные:

station_data_anual
Out[238]: 
                        Y_TT   Y_RR
MESS_DATUM_BEGINN                  
...
2003-12-31          9.866667  430.5
2004-12-31          9.620833   66.3
2005-12-31          9.665833    0.0
2006-12-31         10.158333    0.0
2007-12-31         10.555000    0.0
2008-12-31         10.361667    0.0
2009-12-31          9.587500    0.0
2010-12-31          8.207500    0.0

мой результат должен выглядеть так:

                        Y_TT       Y_TX      Y_TN   Y_RR
MESS_DATUM_BEGINN                                       
... 
                        Y_TT   Y_RR
MESS_DATUM_BEGINN                  
...
2003-12-31          9.866667  430.5
2004-12-31          9.620833    nan    # getting nan instead of 66.3 is especally important
2005-12-31          9.665833    nan
2006-12-31         10.158333    nan
2007-12-31         10.555000    nan
2008-12-31         10.361667    nan
2009-12-31          9.587500    nan
2010-12-31          8.207500    nan

person Rebecca    schedule 03.01.2020    source источник
comment
По умолчанию skipna равно True при выполнении mean() в пандах. pandas.pydata.org/pandas-docs/ стабильный / ссылка / api /   -  person moys    schedule 03.01.2020
comment
@moys благодарим вас за ответ, но station_data_anual [Y_TT] = station_data [MO_TT] .resample (A) .mean (skipna = True) возвращает: UnsupportedFunctionCall: операции numpy недействительны с повторной выборкой. Вместо этого используйте .resample (...). Mean ()   -  person Rebecca    schedule 03.01.2020
comment
Можете ли вы опубликовать входные данные и ожидаемые выходные данные (в виде текста)? Это упростит поиск проблем и предоставит вам решение.   -  person moys    schedule 03.01.2020
comment
@moys хорошо, но он великоват   -  person Rebecca    schedule 03.01.2020
comment
@moys oky Я выложил входные данные   -  person Rebecca    schedule 03.01.2020


Ответы (2)


Я никогда не использовал выборку, и могли бы быть лучшие решения, которые могли бы просто игнорировать «группу» на основе «условия». Но очень простым решением может быть использование специальной функции среднего после resample.

def very_mean(array_like):
    if any(pd.isnull(array_like)):
        return np.nan
    else:
        return array_like.mean()

station_data_anual["Y_TT"] = station_data["MO_TT"].resample("A").apply(very_mean)
person Ali Faizan    schedule 03.01.2020
comment
Спасибо. Что мне добавить в массив? Я вставил station_data для массива. Но когда я это сделаю, функция вернет только nans. - person Rebecca; 03.01.2020
comment
Большое спасибо! Кажется, это работает. И еще хорошо знать, как построить функционал. Я не так развит. Мне все еще нужно научиться строить функции. :) Теперь я счастлив! - person Rebecca; 03.01.2020

Не могли бы вы сначала попытаться удалить значения nan?

station_data_anual = pd.DataFrame()
station_data_anual["Y_TT"] = station_data["MO_TT"].dropna().resample("A").mean()
station_data_anual["Y_RR"] = station_data["MO_RR"].dropna().resample("A").sum()

person Mayowa Ayodele    schedule 03.01.2020
comment
Спасибо за ваш ответ. Для MO_RR в 2004 году он все еще возвращает 66,3. Для лет со значениями только nan он возвращает nan. - person Rebecca; 03.01.2020