我想使用以下代码计算两个熊猫列IImean的绝对差

    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已经提到,在询问熊猫问题时,请始终提供可复制的样本和所需的数据集

10-02 10:37