1

我有一个 Pandas TimeSeries,其值<0.1表示检测限:

In [1]: type(ts)
Out[1]: pandas.core.series.TimeSeries

In [2]: ts[55:63]
Out[2]: Date
2006-08-07    0.8809099
2006-08-21     1.027876
2007-07-10    0.5982836
2007-07-26          0.8
2007-08-09         <0.1
2007-08-23     1.013378
2008-07-14    0.6568888
2008-07-29    0.6966623
Name: PO4 uM

我一直在尝试:

ts.str.contains('<0.1')

但无法弄清楚如何使用它来替换我的数据值。

如何最好地将这些检测限指标替换为 Pandas 可以处理的值?

4

1 回答 1

2

我认为你最好的选择是在读入时删除这些特殊值(这样你dtype就会是正确的,float64)。
要做到这一点read_csv(和大多数类似的功能)有一个na_values参数:

na_values: list-like or dict, default None
    额外的字符串被识别为 NA/NaN。如果 dict 通过,特定的每列 NA 值

注意:我已经复制ts[55:63]并使用read_clipboard了(它也接受了这个参数)。

In [1]: pd.read_clipboard(sep='\s+', header=None, na_values='<0.1')
Out[1]: 
            0         1
0  2006-08-07  0.880910
1  2006-08-21  1.027876
2  2007-07-10  0.598284
3  2007-07-26  0.800000
4  2007-08-09       NaN
5  2007-08-23  1.013378
6  2008-07-14  0.656889
7  2008-07-29  0.696662

进入(时间)系列,您可以使用:

ts = pd.read_clipboard(sep='\s+', header=None, na_values='<0.1',
                       index_col=['date'], squeeze=True, names=['date', 'P04'],
                       parse_dates=['date'])

In [3]: ts
Out[3]: 
date
2006-08-07    0.880910
2006-08-21    1.027876
2007-07-10    0.598284
2007-07-26    0.800000
2007-08-09         NaN
2007-08-23    1.013378
2008-07-14    0.656889
2008-07-29    0.696662
Name: P04

这似乎比使用更清洁:

ts[ts.str.contains('<0.1')] = np.nan
于 2013-02-11T22:49:53.303 回答