2016-07-24 48 views
2

我想計算兩隻大熊貓列IImean用下面的代碼的絕對差值之間pandas.apply()的區別返回NaN兩列

def diff(row): 
     """ calculate absolute difference of this row """ 
     return np.abs(row['I'] - row['Imean']) 

    spectrum['diff'] = spectrum.apply(diff, axis=1) 

每當spectrum['I']都是零,spectrum['diff']包含所有nan 。我錯過了什麼? (如果我檢查spectrum['I']爲全零的情況下,然後spectrum['diff'] = spectrum['Imean']我可以規避錯誤但仍...)。

補充信息:

好吧,我進一步調查,並找到了我的問題。我通過曲線下方的面積歸我的數據,並嘗試通過零避免分裂,因爲我知道,有可能是全零目前的數據。

s = spectrum['I'].sum() 
    try: 
     spectrum['I'] /= s 
    except ValueError: 
     spectrum['I'] = 0.0 

我沒有得到任何警告,運行時間從我的劇本,但如果我在IPython的控制檯上運行我的代碼,我得到RuntimeWarning: invalid value encountered in true_dividespectrum['I']得到由NaN條代替。如果我使用ZeroDivisionError也是如此。 那麼,如何正確地避免被零除這裏?

+1

有可能是一堆你錯過的東西,但我注意到,失蹤的第一件事是樣本數據集。嘗試在提出問題時遵循這些標準:http://stackoverflow.com/help/mcve – piRSquared

回答

1

如果我理解正確的話,你可以這樣來做:

In [6]: df = pd.DataFrame(np.random.randint(0, 20, (10,2)), columns=['I', 'Imean']) 

In [7]: df['diff'] = (df['I'] - df['Imean']).abs() 

In [8]: df 
Out[8]: 
    I Imean diff 
0 2  9  7 
1 9  1  8 
2 18  11  7 
3 6  19 13 
4 5  12  7 
5 4  8  4 
6 13  3 10 
7 1  19 18 
8 6  5  1 
9 7  0  7 

全部爲零:

In [9]: df.I=0 

In [10]: df 
Out[10]: 
    I Imean diff 
0 0  9  7 
1 0  1  8 
2 0  11  7 
3 0  19 13 
4 0  12  7 
5 0  8  4 
6 0  3 10 
7 0  19 18 
8 0  5  1 
9 0  0  7 

In [11]: df['diff'] = (df['I'] - df['Imean']).abs() 

In [12]: df 
Out[12]: 
    I Imean diff 
0 0  9  9 
1 0  1  1 
2 0  11 11 
3 0  19 19 
4 0  12 12 
5 0  8  8 
6 0  3  3 
7 0  19 19 
8 0  5  5 
9 0  0  0 

PS爲@piRSquared已經提到的,請始終提供重複的樣品和所需的數據集時,問大熊貓問題