我有一个pandas数据帧df,pandas.tseries.index.DatetimeIndex作为索引。
数据是这样的:
Time Open High Low Close Volume
2007-04-01 21:02:00 1.968 2.389 1.968 2.389 18.300000
2007-04-01 21:03:00 157.140 157.140 157.140 157.140 2.400000
...
我想要替换一个数据点,让“使用NaN:
”列中的第2.389天In: df["Close"].replace(2.389, np.nan)
Out: 2007-04-01 21:02:00 2.389
2007-04-01 21:03:00 157.140
替换未将2.389更改为NaN。怎么了?
答案 0 :(得分:6)
replace
可能不适用于浮点数,因为您在DataFrame的repr
中看到的浮点表示可能与底层浮点数不同。例如,实际的Close值可能是:
In [141]: df = pd.DataFrame({'Close': [2.389000000001]})
然而df
的代表看起来像:
In [142]: df
Out[142]:
Close
0 2.389
因此,不检查浮点相等性,通常最好检查接近度:
In [150]: import numpy as np
In [151]: mask = np.isclose(df['Close'], 2.389)
In [152]: mask
Out[152]: array([ True], dtype=bool)
然后,您可以使用布尔掩码选择和更改所需的值:
In [145]: df.loc[mask, 'Close'] = np.nan
In [146]: df
Out[146]:
Close
0 NaN
答案 1 :(得分:2)
您需要将结果分配到df['Close']
或传递参数inplace=True
:df['Close'].replace(2.389, np.NaN, inplace=True)
e.g:
In [5]:
df['Close'] = df['Close'].replace(2.389, np.NaN)
df['Close']
Out[5]:
0 2.389
1 157.140
Name: Close, dtype: float64
大多数pandas操作返回一个副本,一些人接受参数inplace
。