Python:Pandas模块-嵌套的IF语句,该语句在数据框中填充NaN(空值)

时间:2018-11-07 18:28:39

标签: python-3.x pandas dataframe null

我已经创建了一个函数,该函数根据“名称”列中的数据测试多个IF语句。

条件1:如果“名称”为空白,则返回“ Secondary_Name”。但是,如果“ Secondary_Name”也为空,则返回“ Third_Name”。

条件2:如果“名称” ==“通用”,则返回“第二名称”。但是,如果“ Secondary_Name”也为空,则返回“ Third_Name”

其他:返回“名称”

Dirty

我尝试过== None,== np.NaN,== Null,.isnull(),=='',=='0'。

似乎没有什么可以代替空值。

编辑:

Example of DF

2 个答案:

答案 0 :(得分:0)

取决于列dtype,无论出于何种原因,NULL都不能与NaN很好地交互。 没有值表示该字段为空,不是因为您对给定的dtype有一个“值”。

确保您可以识别NaN的简单方法是查看该字段是否等于其自身

def isNaN(value):
if value != value: 
    return True
else:
    return False

并提供一个示例:

df = pd.DataFrame(data={'ClientId':[1,2,3,4] , 'SomeNULLs':['main','main',None,None], 'NewNULLs':[1,None,0,1]})

df['Test'] = df.NewNULLs.apply(isNaN)

结果数据集应该是

   ClientId SomeNULLs  NewNULLs   Test
0         1      main       1.0  False
1         2      main       NaN   True
2         3      None       0.0  False
3         4      None       1.0  False

答案 1 :(得分:0)

考虑这个df

df = pd.DataFrame({'Name':['a', 'GENERAL', None],'Secondary_Name':['e','f',None], 'Third_Name':['x', 'y', 'z']})

    Name    Secondary_Name  Third_Name
0   a       e               x
1   GENERAL f               y
2   None    None            z

由于您是用python编写函数,因此可以使用None

def account_name(row):

    if (row['Name'] is None or row['Name'] == 'GENERAL') and (row['Secondary_Name'] is None):
        return row['Third_Name']

    elif row['Name'] is None or row['Name'] == 'GENERAL':
        return row['Secondary_Name']

    else:
        return row['Name']

df['Name'] = df.apply(account_name, axis = 1)

你得到

    Name    Secondary_Name  Third_Name
0   a       e               x
1   f       f               y
2   z       None            z

您可以使用pandas和嵌套的np.where

获得相同的输出
cond1 = (df['Name'].isnull()) | (df['Name'] == 'GENERAL')
cond2 = (cond1) & (df['Secondary_Name'].isnull())
np.where(cond2, df['Third_Name'], np.where(cond1, df['Secondary_Name'], df['Name']))