我想使用以下代码计算两个熊猫列I
和Imean
的绝对差
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_divide
,而spectrum['I']
被替换为NaN
。如果使用ZeroDivisionError
,则相同。那么如何正确避免在这里被零除?
最佳答案
如果我理解正确,则可以通过以下方式进行操作:
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已经提到,在询问熊猫问题时,请始终提供可复制的样本和所需的数据集