np.where лечение np.nan (NaNs оценивается как значение <0) - PullRequest
1 голос
/ 01 ноября 2019

Я использую np.where для проведения логической проверки чисел с плавающей точкой, чтобы определить, является ли значение> или <0. В кадре данных pandas есть значения np.nan из-за вычислений, и мне бы хотелось, чтобы np.whereфункция "игнорировать" строки np.nan - другими словами, сохранить эту строку как np.nan. Как я могу это сделать? </p>

Вот пример с некоторыми фиктивными данными.

import pandas as pd
import numpy as np

#create some dummy data with datetime index
prices = [100, 99, 98, 101, 102, 99]
dates = pd.date_range(start='1/1/2018', end='1/06/2018')
so_df = pd.DataFrame(prices, index=dates)
so_df.columns = ['Close']

#calculate daily % changes
so_df['pct_change'] = so_df.Close.pct_change()

#logic test to determine if pct_change > 0 or not
so_df['greater_zero?'] = np.where(so_df['pct_change'] > 0, 1, 0)

Глядя на фрейм данных, мы можем видеть, что первая строка - это np.nan и все же numyоценивает это как значение меньше нуля, что неверно. Это должно быть просто np.nan.

    Close   pct_change  greater_zero?
2018-01-01  100 NaN 0
2018-01-02  99  -0.010000   0
2018-01-03  98  -0.010101   0
2018-01-04  101 0.030612    1
2018-01-05  102 0.009901    1
2018-01-06  99  -0.029412   0

В документации np.where , похоже, нет встроенного аргумента о том, как обрабатывать значения np.nan. Я также пытался встроить несколько функций np.where, но не смог заставить это работать. Есть еще идеи?

Ответы [ 2 ]

1 голос
/ 01 ноября 2019

Вы можете использовать np.where , например:

so_df['greater_zero?'] = np.where(np.isnan(so_df['pct_change']), so_df['pct_change'], (so_df['pct_change'] > 0).astype(int))

print(so_df)

Выход

            Close  pct_change  greater_zero?
2018-01-01    100         NaN            NaN
2018-01-02     99   -0.010000            0.0
2018-01-03     98   -0.010101            0.0
2018-01-04    101    0.030612            1.0
2018-01-05    102    0.009901            1.0
2018-01-06     99   -0.029412            0.0

В основном, где NaN используют то же самоеВ противном случае используйте значение сравнения напрямую

1 голос
/ 01 ноября 2019

Вы можете использовать Series.mask для установки NaN значений:

so_df['greater_zero?'] = np.where(so_df['pct_change'] > 0, 1, 0)
so_df['greater_zero?'].mask(so_df['pct_change'].isna(),np.nan,inplace=True)

print(so_df)

            Close  pct_change  greater_zero?
2018-01-01    100         NaN            NaN
2018-01-02     99   -0.010000            0.0
2018-01-03     98   -0.010101            0.0
2018-01-04    101    0.030612            1.0
2018-01-05    102    0.009901            1.0
2018-01-06     99   -0.029412            0.0

или Series.where:

so_df['greater_zero?'].where(so_df['pct_change'].notna(),np.nan,inplace=True)
...