Columna de llenado con si la condición no funciona como se esperaba

Digamos que tengo el siguiente DataFrame:

0 1 2 1 10/1/2016 'stringvalue' 456 2 NaN 'anothersting' NaN 3 NaN 'and another ' NaN 4 11/1/2016 'more strings' 943 5 NaN 'stringstring' NaN 

Quiero crear una nueva columna ‘Entrada completa’ que se basa en una condición. Si el valor de df [2] es NaN df [‘Entrada completa’] también debe ser NaN.

Si df [2]! = NaN df [‘Entrada completa’] debe tomar el valor de df [1]. Quiero repetir esto para cada fila.

Se me ha ocurrido el siguiente código

 df['Full_Entry'] = [df[1] if pd.isnull(x) == False else np.NaN for x in df[2]] 

Pero esto me da los siguientes resultados.

  0 1 2 Full_Entry: 1 10/1/2016 'stringvalue' 456 0 stringv... 2 NaN 'anothersting' NaN NaN 3 NaN 'and another ' NaN NaN 4 11/1/2016 'more strings' 943 0 stringv... 5 NaN 'stringstring' NaN NaN 

Sin embargo, lo que quiero es esto:

  0 1 2 Full_Entry: 1 10/1/2016 'stringvalue' 456 stringvalue 2 NaN 'anothersting' NaN NaN 3 NaN 'and another ' NaN NaN 4 11/1/2016 'more strings' 943 more strings 5 NaN 'stringstring' NaN NaN 

La condición ‘if’ en mi código parece activarse en los momentos correctos, pero solo usa el valor de la primera fila. Y por alguna razón también se incluye un ‘0’.

¿Alguien tiene una idea de lo que está mal con mi código?

Use numpy where :

df['Full_Entry']=np.where(pd.isnull(df.2), np.NaN, df.1)

Opción 1
pd.Series.mask

 df['Full Entry'] = df.iloc[:, 1].mask(df.iloc[:, 2].isnull()) 

O,

 df['Full Entry'] = df.iloc[:, 2].mask(pd.notnull, df.iloc[:, 1]) 

 df 0 1 2 Full Entry 1 10/1/2016 stringvalue 456.0 stringvalue 2 NaN anothersting NaN NaN 3 NaN and another NaN NaN 4 11/1/2016 more strings 943.0 more strings 5 NaN stringstring NaN NaN 

opcion 2
pd.Series.where

 df['Full Entry'] = df.iloc[:, 2].where(pd.isnull, df.iloc[:, 1]) df 0 1 2 Full Entry 1 10/1/2016 stringvalue 456.0 stringvalue 2 NaN anothersting NaN NaN 3 NaN and another NaN NaN 4 11/1/2016 more strings 943.0 more strings 5 NaN stringstring NaN NaN 

También se puede utilizar la función de apply :

 df['Full Entry'] = df.apply(lambda x: np.NaN if pd.isnull(x[2]) else x[1], axis=1) print(df) 

Salida:

  0 1 2 Full Entry 1 10/1/2016 stringvalue 456.0 stringvalue 2 NaN anothersting NaN NaN 3 NaN and another NaN NaN 4 11/1/2016 more strings 943.0 more strings 5 NaN stringstring NaN NaN