pandas.apply()从两​​列之间的差异返回NaN

时间:2016-07-24 08:55:03

标签: python numpy pandas

我想使用以下代码计算两个pandas列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_dividespectrum['I']替换为NaN。如果我使用ZeroDivisionError,则相同。 那么如何在这里正确避免除零呢?

1 个答案:

答案 0 :(得分: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已经提到过,请在提出熊猫问题时提供可重复的样本和所需的数据集

相关问题