Pandas替换数据帧时间序列中的值

时间:2015-01-16 19:55:03

标签: python replace pandas

我有一个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。怎么了?

2 个答案:

答案 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=Truedf['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

检查文档:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.replace.html#pandas.Series.replace