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).Respuestas:
Creo que
df.replace()
hace el trabajo, ya que los pandas 0.13 :Produce:
Como lo señaló Temak, úselo
df.replace(r'^\s+$', np.nan, regex=True)
en caso de que sus datos válidos contengan espacios en blanco.fuente
pd.Series(["1", "#", "9", " .", None]).replace(r"( +\.)|#", "X", regex=True).values
que da['1', 'X', '9', 'X', None]
df.replace(r'^\s+$', np.nan, regex=True)
Si desea reemplazar una cadena vacía y registros con solo espacios, la respuesta correcta es :
La respuesta aceptada
¡No reemplaza una cadena vacía !, puede probarlo usted mismo con el ejemplo dado ligeramente actualizado:
Tenga en cuenta también que 'fo o' no se reemplaza con Nan, aunque contiene un espacio. Nota adicional, que un simple:
Tampoco funciona, pruébalo.
fuente
Qué tal si:
La
applymap
función aplica una función a cada celda del marco de datos.fuente
isinstance
será un poco más rápido.''
. Para considerar también cadenas vacías, use:d = d.applymap(lambda x: np.nan if isinstance(x, basestring) and (not x or x.isspace()) else x)
Haré esto:
o
Puede quitar todos los str, luego reemplazar str vacío con
np.nan
.fuente
La más simple de todas las soluciones:
fuente
Si está exportando los datos del archivo CSV, puede ser tan simple como esto:
Esto creará el marco de datos y reemplazará los valores en blanco como Na
fuente
skipinitialspace=True
también elimina cualquier espacio en blanco después del delimitador que causaría cualquier longitud de espacio en blanco, las cadenas vacías se leerán comonan
. Sin embargo, si desea conservar los espacios iniciales por cualquier razón, esta opción no es una buena opción.Para una solución muy rápida y simple en la que verifique la igualdad con un solo valor, puede usar el
mask
método.fuente
Todos estos están cerca de la respuesta correcta, pero no diría que ninguno resuelva el problema mientras sigue siendo más legible para otros que leen su código. Yo diría que la respuesta es una combinación de la Respuesta de BrenBarn y el comentario de tuomasttik debajo de esa respuesta . La respuesta de BrenBarn utiliza
isspace
incorporado, pero no admite la eliminación de cadenas vacías, como lo solicitó OP, y tendería a atribuirlo como el caso de uso estándar de reemplazar cadenas con valores nulos.Lo reescribí con
.apply
, para que pueda llamarlo en unpd.Series
opd.DataFrame
.Python 3:
Para reemplazar cadenas vacías o cadenas de espacios enteramente:
Para reemplazar cadenas de espacios enteramente:
Para usar esto en Python 2, deberá reemplazarlo
str
porbasestring
.Python 2:
Para reemplazar cadenas vacías o cadenas de espacios enteramente:
Para reemplazar cadenas de espacios enteramente:
fuente
Esto funcionó para mí. Cuando importo mi archivo csv agregué na_values = ''. Los espacios no están incluidos en los valores predeterminados de NaN.
df = pd.read_csv (filepath, na_values = '')
fuente
También puedes usar un filtro para hacerlo.
fuente
fuente
Esta no es una solución elegante, pero lo que parece funcionar es guardar en XLSX y luego volver a importarlo. Las otras soluciones en esta página no funcionaron para mí, sin saber por qué.
fuente