2016-07-24 22 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已经提到的,请始终提供重复的样品和所需的数据集时,问大熊猫问题