Muchos científicos de datos consideran que los pasos iniciales de adquisición y limpieza de datos representan el 80 % del trabajo, dedicando mucho tiempo a limpiar conjuntos de datos y reducirlos a una forma que se pueda usar.
Entonces, si es nuevo en el campo o planea hacerlo, es importante poder manejar datos desordenados, ya sea que contengan valores faltantes, formato inconsistente, registros mal formados o valores atípicos sin sentido.
Usaremos las bibliotecas Pandas y NumPy de Python para limpiar los datos.
Directorio de artículos
- Listo para trabajar
- Eliminación de columnas de DataFrame
- Cambios en el índice de DataFrame
- Intercalación de campos de datos de DataFrame
- método str combinado con NumPy para limpiar columnas
- aplicar la función para limpiar todo el conjunto de datos
- Saltar filas de DataFrame
- Columna de cambio de nombre de DataFrame
Listo para trabajar
Mensaje privado o siga la cuenta oficial para responder "Fundamentos de ciencia de datos para la limpieza de datos con Pandas y NumPy" para obtener la dirección de descarga del conjunto de datos en el artículo.
Después de importar el módulo, inicie el preprocesamiento formal de datos.
import pandas as pd
import numpy as np
Eliminación de columnas de DataFrame
A menudo se encuentra que no todas las categorías de datos en el conjunto de datos son útiles. Por ejemplo, es posible que tenga un conjunto de datos con información de los estudiantes (nombre, calificación, criterios, nombres de los padres y direcciones), pero desee concentrarse en analizar las calificaciones de los estudiantes. La dirección o el nombre de los padres no es importante en este caso. Mantener estos datos no deseados ocupará un espacio innecesario.
Manipulación de datos BL-Flickr-Images-Book.csv .
df = pd.read_csv('数据科学必备Pandas、NumPy进行数据清洗/BL-Flickr-Images-Book.csv')
df.head()
Se puede ver que estas columnas no son útiles para la Mención de edición, Autor corporativo, Colaboradores corporativos, Propietario anterior, Grabador, Tipo de emisión y Marcas de estantería, por lo que se puede realizar la eliminación por lotes.
to_drop_column = [ 'Edition Statement',
'Corporate Author',
'Corporate Contributors',
'Former owner',
'Engraver',
'Contributors',
'Issuance type',
'Shelfmarks']
df.drop(to_drop_column , inplace=True, axis=1)
df.head()
Cambios en el índice de DataFrame
La indexación de Pandas amplía las capacidades de las matrices NumPy para permitir un corte y etiquetado más generales. En muchos casos, es útil identificar un campo con el valor único de los datos como su índice.
Obtenga el identificador único.
df['Identifier'].is_unique
True
La columna Identificador reemplaza la columna de índice.
df = df.set_index('Identifier')
df.head()
206 es la primera etiqueta del índice y se puede acceder a ella mediante la indexación basada en posiciones de df.iloc[0].
Intercalación de campos de datos de DataFrame
Limpie columnas específicas y conviértalas a un formato unificado para comprender mejor el conjunto de datos y hacer cumplir la coherencia.
Al procesar la columna Fecha de publicación , se encontró que el formato de la columna de datos no es uniforme.
df.loc[1905:, 'Date of Publication'].head(10)
Identifier
1905 1888
1929 1839, 38-54
2836 1897
2854 1865
2956 1860-63
2957 1873
3017 1866
3131 1899
4598 1814
4884 1820
Name: Date of Publication, dtype: object
Podemos usar expresiones regulares para extraer directamente 4 números consecutivos.
extr = df['Date of Publication'].str.extract(r'^(\d{4})', expand=False)
extr.head()
Identifier
206 1879
216 1868
218 1869
472 1851
480 1857
Name: Date of Publication, dtype: object
Finalmente obtenga la columna del campo numérico.
df['Date of Publication'] = pd.to_numeric(extr)
método str combinado con NumPy para limpiar columnas
df['Fecha de publicación'].str . Esta propiedad es una forma de acceder a operaciones de cadenas rápidas en Pandas que imitan en gran medida las operaciones en cadenas nativas de Python o expresiones regulares compiladas, como .split(), .replace() y .capitalize().
Para limpiar el campo Lugar de publicación, podemos combinar el método str de Pandas con la función np.where de NumPy, que es básicamente una versión vectorizada de la macro IF() de Excel.
np.where(condition, then, else)
Aquí la condición es un objeto tipo matriz o una máscara booleana. entonces es el valor a usar si la condición se evalúa como True y el valor a usar en caso contrario.
Esencialmente, .where() toma cada elemento en el objeto utilizado para la condición, verifica si ese elemento en particular se evalúa como Verdadero en el contexto de la condición y devuelve un ndarray que contiene entonces o bien, lo que corresponda. Se puede anidar dentro de declaraciones compuestas si-entonces, lo que permite que los valores se calculen en función de múltiples condiciones.
Procesar Datos del lugar de publicación .
df['Place of Publication'].head(10)
Identifier
206 London
216 London; Virtue & Yorston
218 London
472 London
480 London
481 London
519 London
667 pp. 40. G. Bryan & Co: Oxford, 1898
874 London]
1143 London
Name: Place of Publication, dtype: object
Utilice el método incluido para extraer la información de datos necesaria.
pub = df['Place of Publication']
london = pub.str.contains('London')
london[:5]
Identifier
206 True
216 True
218 True
472 True
480 True
Name: Place of Publication, dtype: bool
También se puede procesar usando np.where.
df['Place of Publication'] = np.where(london, 'London',
pub.str.replace('-', ' ')))
Identifier
206 London
216 London
218 London
472 London
480 London
...
4158088 London
4158128 Derby
4159563 London
4159587 Newcastle upon Tyne
4160339 London
Name: Place of Publication, Length: 8287, dtype: object
aplicar la función para limpiar todo el conjunto de datos
En algunos casos, aplique una función personalizada a cada celda o elemento del DataFrame. El método Pandas.apply() es similar a la función integrada map(), pero aplica la función a todos los elementos del DataFrame.
Por ejemplo, para procesar la fecha de publicación de los datos en el formato de xxxx año, puede usar apply.
def clean_date(text):
try:
return str(int(text)) + "年"
except:
return text
df["new_date"] = df["Date of Publication"].apply(clean_date)
df["new_date"]
Identifier
206 1879年
216 1868年
218 1869年
472 1851年
480 1857年
...
4158088 1838年
4158128 1831年
4159563 NaN
4159587 1834年
4160339 1834年
Name: new_date, Length: 8287, dtype: object
Saltar filas de DataFrame
olympics_df = pd.read_csv('数据科学必备Pandas、NumPy进行数据清洗/olympics.csv')
olympics_df.head()
Puede agregar parámetros para omitir algunas filas innecesarias al leer datos, como la fila de índice 0.
olympics_df = pd.read_csv('数据科学必备Pandas、NumPy进行数据清洗/olympics.csv',header=1)
olympics_df.head()
Columna de cambio de nombre de DataFrame
new_names = {
'Unnamed: 0': 'Country',
'? Summer': 'Summer Olympics',
'01 !': 'Gold',
'02 !': 'Silver',
'03 !': 'Bronze',
'? Winter': 'Winter Olympics',
'01 !.1': 'Gold.1',
'02 !.1': 'Silver.1',
'03 !.1': 'Bronze.1',
'? Games': '# Games',
'01 !.2': 'Gold.2',
'02 !.2': 'Silver.2',
'03 !.2': 'Bronze.2'}
olympics_df.rename(columns=new_names, inplace=True)
olympics_df.head()