Al eliminar una columna en un DataFrame, uso:
del df['column_name']Y esto funciona muy bien. ¿Por qué no puedo usar lo siguiente?
del df.column_name Dado que es posible acceder a la columna/Serie como df.column_name , esperaba que esto funcionara.
La versión 0.21 de Pandas ha cambiado drop el método de colocación para incluir los parámetros de index y columns para que coincidan con la firma de los métodos de cambio de rename y reindex .
df.drop(columns=['column_a', 'column_c']) Personalmente, prefiero usar el parámetro de axis para indicar columnas o índices porque es el parámetro de palabra clave predominante que se usa en casi todos los métodos de pandas. Pero, ahora tiene algunas opciones adicionales en la versión 0.21.
Otra forma de eliminar una columna en un Pandas DataFrame
Si no está buscando la eliminación en el lugar , puede crear un nuevo DataFrame especificando las columnas usando la DataFrame(...) como:
my_dict = { 'name' : ['a','b','c','d'], 'age' : [10,20,25,22], 'designation' : ['CEO', 'VP', 'MD', 'CEO']} df = pd.DataFrame(my_dict)Crear un nuevo DataFrame como
newdf = pd.DataFrame(df, columns=['name', 'age'])Obtiene un resultado tan bueno como el que obtiene con del / drop.
Visto desde un punto de vista general de Python, del obj.column_name tiene sentido si el atributo column_name se puede eliminar. Debe ser un atributo regular, o una propiedad con un eliminador definido.
Las razones por las que esto no se traduce a Pandas y no tiene sentido para Pandas Dataframes son:
df.column_name como un "atributo virtual", no es una cosa por derecho propio, no es el "asiento" de esa columna, es solo una forma de acceder a la columna. Al igual que una propiedad sin eliminador.Eliminar una columna usando la función iloc de dataframe y slicing , cuando tenemos un nombre de columna típico con valores no deseados:
df = df.iloc[:,1:] # Removing an unnamed index column Aquí 0 es la fila predeterminada y 1 es la primera columna, por lo que :,1: es nuestro parámetro para eliminar la primera columna.
Utilizar:
df.drop('columnname', axis =1, inplace = True)O bien puedes ir con
del df['colname']Para eliminar varias columnas en función de los números de columna
df.drop(df.iloc[:,1:3], axis = 1, inplace = True)Para eliminar varias columnas en función de los nombres de las columnas
df.drop(['col1','col2',..'coln'], axis = 1, inplace = True)Podemos eliminar o eliminar una columna específica o columnas específicas mediante el método drop() .
Supongamos que df es un marco de datos.
Columna a eliminar = columna0
Código:
df = df.drop(column0, axis=1)Para eliminar varias columnas col1, col2, . . . , coln, tenemos que insertar todas las columnas que deben eliminarse en una lista. Luego elimínelos con el método drop().
Código:
df = df.drop([col1, col2, . . . , coln], axis=1)Si su marco de datos original df no es demasiado grande, no tiene restricciones de memoria y solo necesita mantener algunas columnas o, si no sabe de antemano los nombres de todas las columnas adicionales que no necesita, entonces también podría crear un nuevo marco de datos con solo las columnas que necesita:
new_df = df[['spam', 'sausage']]Suprímanse las columnas primera, segunda y cuarta:
df.drop(df.columns[[0,1,3]], axis=1, inplace=True)Eliminar primera columna:
df.drop(df.columns[[0]], axis=1, inplace=True) Hay un parámetro inplace para que los datos originales se puedan modificar sin crear una copia.
Selección de columna, adición, eliminación
Eliminar columna column-name :
df.pop('column-name') df = DataFrame.from_items([('A', [1, 2, 3]), ('B', [4, 5, 6]), ('C', [7,8, 9])], orient='index', columns=['one', 'two', 'three']) print df :
one two three A 1 2 3 B 4 5 6 C 7 8 9 df.drop(df.columns[[0]], axis=1, inplace=True) print df :
two three A 2 3 B 5 6 C 8 9 three = df.pop('three') print df :
two A 2 B 5 C 8Utilizar:
columns = ['Col1', 'Col2', ...] df.drop(columns, inplace=True, axis=1) Esto eliminará una o más columnas en el lugar. Tenga en cuenta que inplace=True se agregó en pandas v0.13 y no funcionará en versiones anteriores. Tendrías que asignar el resultado de nuevo en ese caso:
df = df.drop(columns, axis=1)Es una buena práctica usar siempre la notación [] . Una de las razones es que la notación de atributos ( df.column_name ) no funciona para índices numerados:
In [1]: df = DataFrame([[1, 2, 3], [4, 5, 6]]) In [2]: df[1] Out[2]: 0 2 1 5 Name: 1 In [3]: df.1 File "<ipython-input-3-e4803c0d1066>", line 1 df.1 ^ SyntaxError: invalid syntaxComo habrás adivinado, la sintaxis correcta es
del df['column_name'] Es difícil hacer que del df.column_name funcione simplemente como resultado de las limitaciones sintácticas en Python. del df[name] se traduce a df.__delitem__(name) bajo las sábanas por Python.
La mejor manera de hacer esto en Pandas es usar drop :
df = df.drop('column_name', 1) donde 1 es el número de eje ( 0 para filas y 1 para columnas).
Para eliminar la columna sin tener que reasignar df , puede hacer:
df.drop('column_name', axis=1, inplace=True)Finalmente, para colocar por número de columna en lugar de por etiqueta de columna, intente eliminar, por ejemplo, las columnas 1, 2 y 4:
df = df.drop(df.columns[[0, 1, 3]], axis=1) # df.columns is zero-based pd.IndexTambién trabajando con la sintaxis de "texto" para las columnas:
df.drop(['column_nameA', 'column_nameB'], axis=1, inplace=True) Nota: Introducido en v0.21.0 (27 de octubre de 2017), el método drop() acepta palabras clave de índice/columnas como alternativa a la especificación del eje.
Así que ahora podemos simplemente hacer:
df = df.drop(columns=['column_nameA', 'column_nameB'])La sintaxis de puntos funciona en JavaScript, pero no en Python.
del df['column_name']del df['column_name'] o del df.column_nameDesde la versión 0.16.1, puedes hacer
df.drop(['column_name'], axis = 1, inplace = True, errors = 'ignore')Una buena adición es la capacidad de eliminar columnas solo si existen . De esta manera, puede cubrir más casos de uso, y solo eliminará las columnas existentes de las etiquetas que se le pasaron:
Simplemente agregue errors='ignore' , por ejemplo:
df.drop(['col_name_1', 'col_name_2', ..., 'col_name_N'], inplace=True, axis=1, errors='ignore')En Pandas 0.16.1+, puede soltar columnas solo si existen según la solución publicada por eiTan LaVi . Antes de esa versión, puede lograr el mismo resultado a través de una lista de comprensión condicional:
df.drop([col for col in ['col_name_1','col_name_2',...,'col_name_N'] if col in df], axis=1, inplace=True)