首页 > 解决方案 > 我可以有条件地替换列表中的值吗?

问题描述

我正在尝试在 pandas 中创建一个计算字段,并且给了我两个公式。由于数据问题,当一个公式导致 nan 时,我应该使用另一个公式。但是,我似乎无法获得输出我需要的功能。

这是数据的样子:

        Nest    year    Hatched Unhatched   Pipped  Rel_Eggs
0        1      1980    120.0   NaN         NaN         120.0   
1        2      1980    NaN     NaN         NaN         NaN 
2        3      1980    62.0    NaN         NaN         117.0   
3        4      1980    0.0     NaN         NaN         NaN 
4        5      1980    0.0     NaN         NaN         NaN 
5        6      1980    110.0   NaN         NaN         114.0   

这是我已经尝试过的:

def new_success(data):
    succ = []
    for i in data.index:
        nval = data.loc[i]['Hatched']/(data.loc[i]['Hatched'] + data.loc[i]['Unhatched'] + data.loc[i]['Pipped'])
        if nval != np.inf and nval != np.nan:
                succ.append(nval)

        else:
            val = data.loc[i]['Hatched']/data.loc[i]['Rel_Eggs']
            succ.append(val)

    return succ 

第一个公式有效;第二,条件位不是。基于上面的数据框,对于这前 6 个值,我应该得到

[1.0, nan, 0.523, nan, nan, 0.965]

但我只是得到

[nan, nan, nan, nan, nan, nan]

标签: python

解决方案


您得到的意外结果可能与此行有关:if nval != np.inf and nval != np.nan:- 这不是您检查值是否为NaN. 例子:

import numpy as np
noval = np.nan
print(noval != np.nan)
# prints True - but one might expect False...

# however this works for inf:
noval = np.inf
print(noval != np.inf)
# prints False

改为使用if np.isfinite(nval):

novals = [np.nan, np.inf]
[print(np.isfinite(v)) for v in novals]
# False
# False

更多信息,例如这里


推荐阅读