np.nan的治疗(NaNs评估为值<0)

时间:2019-11-01 20:25:48

标签: python pandas numpy nan

我正在使用np.where进行浮点数的逻辑测试以确定该值是>还是<0。由于计算,在熊猫数据框中存在np.nan值,我希望使用np.where函数以“忽略” np.nan行-换句话说,将该行保留为np.nan。我该怎么办?

这里是一些虚拟数据的例子。

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,但是numpy将此值评估为小于零的值,这是不正确的。这应该只是一个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 documentation,似乎没有关于如何处理np.nan值的内在论点。我也尝试嵌入多个np.where函数,但是无法使其正常工作。还有其他想法吗?

2 个答案:

答案 0 :(得分:1)

您可以使用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)

答案 1 :(得分:1)

您可以像这样使用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基本上在哪里使用相同的值,否则直接使用比较的值