Reemplace el valor utilizando expresiones regulares para np.nan

Tengo un dataframe de la siguiente manera:

data1 = {"first":["alice", "bob", "carol"], "last_huge":["foo", "bar", "baz"]} df = pd.DataFrame(data1) 

Por ejemplo, quiero reemplazar todo el carácter ‘o’ por ‘a’:

Entonces lo hago

 df.replace({"o":"a"},regex=True) Out[668]: first last 0 alice faa 1 bab bar 2 caral baz 

Devuelve lo que necesito.

Sin embargo , cuando quiero reemplazar ‘o’ por np.nan , cambiará toda la cadena a np.nan . ¿Hay alguna explicación del documento de los pandas? Puedo encontrar alguna información a través del código fuente .

Más información: (Cambiará toda la cadena a np.nan )

 df.replace({"o":np.nan},regex=True) Out[669]: first last 0 alice NaN 1 NaN bar 2 NaN baz 

NaN se usa constantemente como marcador de posición para la falta , cuando se reemplaza parte de una cadena por “falta” solo puede significar que toda la entrada está comprometida. He escuchado que se llama contaminación de NaN (o similar, veré si puedo encontrar algunas referencias), ya que si NaN toca la información, se verá comprometida.

Dicho esto, ese no es siempre el caso:

 In [11]: s = pd.Series([1, 2, np.nan, 4]) In [12]: s.sum() Out[12]: 7.0 In [13]: s.sum(skipna=False) Out[13]: nan 

En algunos idiomas, verá skipna = False como el comportamiento predeterminado, algunos argumentan con vehemencia que NaN siempre debe contaminar todos los datos. Pandas tiene un enfoque algo más pragmático …

La verdadera pregunta es: ¿qué esperas que haga en el caso de NaN?

En python hay cmath.nan y math.nan .

Detalle de la implementación de CPython: El módulo matemático consiste principalmente en envolturas delgadas alrededor de las funciones de la biblioteca matemática C de la plataforma. El comportamiento en casos excepcionales sigue el Anexo F de la norma C99 cuando sea apropiado. La implementación actual generará ValueError para operaciones no válidas como sqrt (-1.0) o log (0.0) (donde C99, Anexo F, recomienda señalar la operación no válida o dividir por cero) y OverflowError para los resultados que se desborden (por ejemplo, exp (1000.0 )). No se devolverá un NaN desde ninguna de las funciones anteriores a menos que uno o más de los argumentos de entrada sea un NaN; en ese caso, la mayoría de las funciones devolverán un NaN, pero (de nuevo siguiendo el Anexo F del C99) hay algunas excepciones a esta regla, por ejemplo pow (float (‘nan’), 0.0) o hypot (float (‘nan’), flotar (‘inf’)).

En pocas palabras, cuando sus argumentos de entrada tienen NaN , devolvería NaN

Y también:

Tenga en cuenta que Python no hace ningún esfuerzo para distinguir los NaN de señalización de los NaN silenciosos, y el comportamiento para la señalización de los NaN no se especifica. El comportamiento típico es tratar a todos los NaN como si estuvieran tranquilos.