Quiero encontrar todos los valores en un marco de datos de Pandas que contengan espacios en blanco (cualquier cantidad arbitraria) y reemplazar esos valores con NaN.
¿Alguna idea de cómo se puede mejorar esto?
Básicamente quiero convertir esto:
A B C
2000-01-01 -0.532681 foo 0
2000-01-02 1.490752 bar 1
2000-01-03 -1.387326 foo 2
2000-01-04 0.814772 baz
2000-01-05 -0.222552 4
2000-01-06 -1.176781 qux
Dentro de esto:
A B C
2000-01-01 -0.532681 foo 0
2000-01-02 1.490752 bar 1
2000-01-03 -1.387326 foo 2
2000-01-04 0.814772 baz NaN
2000-01-05 -0.222552 NaN 4
2000-01-06 -1.176781 qux NaN
Me las arreglé para hacerlo con el código a continuación, pero el hombre es feo. No es Pythonic y estoy seguro de que tampoco es el uso más eficiente de los pandas. Recorro cada columna y hago un reemplazo booleano contra una máscara de columna generada al aplicar una función que realiza una búsqueda de expresiones regulares de cada valor, que coincide en el espacio en blanco.
for i in df.columns:
df[i][df[i].apply(lambda i: True if re.search('^\s*$', str(i)) else False)]=None
Se podría optimizar un poco solo iterando a través de campos que podrían contener cadenas vacías:
if df[i].dtype == np.dtype('object')
Pero eso no es una gran mejora
Y finalmente, este código establece las cadenas de destino en None, que funciona con las funciones de Pandas fillna()
, pero sería bueno para completar si pudiera insertar un NaN
directamente en lugar de None
.
replace
con una expresión regular ... (tal vez esto debería solicitarse como una característica).