2013-02-11 30 views
1

我有一個熊貓的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可以處理的值取代這些檢測極限指標?

回答

2

我認爲你最好打賭是刪除這些特殊值當在(這樣你的dtype將是正確的,float64)讀書。
要做到這一點read_csv(和大多數類似功能)有一個na_values說法:

na_values:類似列表或字典,默認無
       其他字符串識別爲NA/NaN的。如果字典過去了,具體每列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 
+0

是,使用na_values與pd.ExcelFile .parse用NaN取代<0.1值,但我並不是真的想要NaN,因爲低於檢測極限與缺失值非常不同(Tufte認爲l在「挑戰者」災難中,在O形圈損傷情節中留下「無損」價值扮演了重要角色)。我想用'0.1'替換''<0.1''值是保守的。不幸的是,具有「<0.1」值的系列也有NaN,所以我必須這樣做才能使它工作:'ts [ts.str.contains('<0.1')。replace(NaN,False)] = 0.1' – 2013-02-12 10:51:12

+0

@RichSignell你可以使用'轉換器'參數eg 'pd.read_clipboard(sep ='\ s +',header = None,converters = {1:lambda x:0.1 if x =='<0.1'else x})':) – 2013-02-12 12:39:07

+0

Andy,我很樂意使用轉換器的方法,但我似乎無法得到它的工作。我相信這很簡單。 'urllib.urlretrieve(URL =的 'http://epi.whoi.edu/ipython/results/mdistefano/Falmouth_data.csv',filename='Falmouth_data.csv'); pd.read_csv( 'Falmouth_data.csv',index_col = 'Date', na_values = ['?',None,'NS','no sample left','Sample Destroyed','machine error','#VALUE!'], 轉換器= {'PO4 uM': lambda x:0.1如果x =='<0.1'else x})' – 2013-02-12 21:30:07