Al eliminar una columna en un DataFrame que uso:
del df['column_name']
Y esto funciona muy bien. ¿Por qué no puedo usar lo siguiente?
del df.column_name
Como es posible acceder a la columna / Serie como df.column_name
, esperaba que esto funcionara.
Respuestas:
Como habrás adivinado, la sintaxis correcta es
Es difícil hacer el
del df.column_name
trabajo simplemente como resultado de limitaciones sintácticas en Python.del df[name]
se traduce adf.__delitem__(name)
debajo de las sábanas por Python.fuente
class A(object): def __init__(self): self.var = 1
establece una clase, luegoa = A(); del a.var
funciona bien ...del df[name]
, se traduce adf.__delitem__(name)
cuál es un método que DataFrame puede implementar y modificar según sus necesidades. En el caso dedel df.name
, la variable miembro se elimina sin posibilidad de ejecutar ningún código personalizado. Considere su propio ejemplo: ¿puede obtenerdel a.var
una impresión de "eliminación de variable"? Si puedes, por favor dime cómo. No puedo :)pandas
desarrolladores no lo hicieron , pero eso no significa que sea difícil de hacer.La mejor manera de hacer esto en pandas es usar
drop
:donde
1
es el número de eje (0
para filas y1
para columnas).Para eliminar la columna sin tener que reasignar
df
puede hacer:Finalmente, para colocar por número de columna en lugar de por etiqueta de columna , intente esto para eliminar, por ejemplo, la primera, segunda y cuarta columna:
También trabajando con la sintaxis de "texto" para las columnas:
fuente
del
por alguna razón?drop
overdel
es que ledrop
permite soltar varias columnas a la vez, realizar la operación en el lugar o no, y también eliminar registros a lo largo de cualquier eje (especialmente útil para una matriz tridimensional oPanel
)drop
overdel
es que drop es parte de la API de pandas y contiene documentación.Utilizar:
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ía que asignar el resultado nuevamente en ese caso:fuente
df.drop(list,inplace=True,axis=1)
del
puede eliminar más de una columna a la vez.Soltar por índice
Eliminar primera, segunda y cuarta columna:
Eliminar primera columna:
Hay un parámetro opcional
inplace
para que los datos originales se puedan modificar sin crear una copia.Reventado
Selección de columna, adición, eliminación.
Eliminar columna
column-name
:Ejemplos:
print df
:df.drop(df.columns[[0]], axis=1, inplace=True)
print df
:three = df.pop('three')
print df
:fuente
df.T.pop('A')
df
. Usted podría hacerdf = df.T; df.pop(index); df = df.T
, pero esto parece excesivo.df.drop(df.columns[[0]], axis=1, inplace=True)
no sería suficiente para usardf.drop([0], axis=1)
?0
, entoncesdf.drop(0, axis=1)
funciona bien. Pero si no sabe el nombre de la columna y necesita eliminar la primera columna, entonces necesitadf.drop(df.columns[[0]], axis=1, inplace=True)
, seleccione la primera columna por posición y suéltela.La pregunta real planteada, omitida por la mayoría de las respuestas aquí es:
¿Por qué no puedo usar
del df.column_name
?Al principio tenemos que entender el problema, que requiere que nos sumerjamos en los métodos mágicos de Python .
Como señala Wes en sus
del df['column']
mapas de respuestas al método mágico de Pythondf.__delitem__('column')
que se implementa en pandas para soltar la columnaSin embargo, como se señaló en el enlace anterior sobre los métodos mágicos de Python :
Se podría argumentar que
del df['column_name']
no se debe usar o alentar, y pordel df.column_name
lo tanto ni siquiera se debe considerar.Sin embargo, en teoría,
del df.column_name
podría implementarse para trabajar en pandas utilizando el método mágico__delattr__
. Sin embargo, esto introduce ciertos problemas, problemas que eldel df['column_name']
implementación ya tiene, pero en menor grado.Problema de ejemplo
¿Qué pasa si defino una columna en un marco de datos llamado "dtypes" o "columnas"?
Luego asuma que quiero eliminar estas columnas.
del df.dtypes
__delattr__
confundiría el método como si debiera eliminar el atributo "dtypes" o la columna "dtypes".Preguntas arquitectónicas detrás de este problema
Pandas responde:
.ix
,.loc
o.iloc
métodos.TLDR;
No puede hacerlo
del df.column_name
porque los pandas tienen una arquitectura bastante desarrollada que necesita ser reconsiderada para que este tipo de disonancia cognitiva no ocurra a sus usuarios.Protip:
No use df.column_name, puede ser bonito, pero causa disonancia cognitiva
Zen de Python cita que encaja aquí:
Hay varias formas de eliminar una columna.
Las columnas son a veces atributos pero a veces no.
¿
del df.dtypes
Eliminar el atributo dtypes o la columna dtypes?fuente
__del__
casi nunca debe usarse debido a las circunstancias precarias en las que se llama; ¡úselo con precaución!" es completamente irrelevante aquí, como lo es el método que se usa aquí__delattr__
.del
que se entiende es el.__del__
método incorporado, no el método de instancia. Eldel
builtin se está asignando__delattr__
y__delitem__
es sobre lo que estoy construyendo mi argumento. Entonces quizás quieras volver a leer lo que escribí.__
...__
se interpreta como marcado en negrita por StackExchangeUna buena adición es la capacidad de soltar 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 errores = 'ignorar' , por ejemplo .:
fuente
desde la versión 0.16.1 puedes hacer
fuente
errors= 'ignore'
)df.drop(['column_1','column_2'], axis=1 , inplace=True,errors= 'ignore')
, si tal aplicación lo desea.Es una buena práctica usar siempre la
[]
notación. Una razón es que la notación de atributo (df.column_name
) no funciona para índices numerados:fuente
Pandas 0.21+ respuesta
La versión 0.21 de Pandas ha cambiado
drop
ligeramente el método para incluir los parámetrosindex
ycolumns
para que coincidan con la firma de los métodosrename
yreindex
.Personalmente, prefiero usar el
axis
parámetro para denotar columnas o índice porque es el parámetro de palabra clave predominante utilizado en casi todos los métodos de pandas. Pero, ahora tiene algunas opciones adicionales en la versión 0.21.fuente
En pandas 0.16.1+, puede soltar columnas solo si existen según la solución publicada por @eiTanLaVi. Antes de esa versión, puede lograr el mismo resultado a través de una comprensión de lista condicional:
fuente
TL; DR
Mucho esfuerzo para encontrar una solución marginalmente más eficiente. Difícil de justificar la complejidad añadida mientras se sacrifica la simplicidad de
df.drop(dlst, 1, errors='ignore')
Preámbulo
Eliminar una columna es semánticamente lo mismo que seleccionar las otras columnas. Mostraré algunos métodos adicionales a tener en cuenta.
También me centraré en la solución general de eliminar varias columnas a la vez y permitir el intento de eliminar columnas que no están presentes.
El uso de estas soluciones es general y funcionará también para el caso simple.
Configuración
Considere la
pd.DataFrame
df
lista y para eliminardlst
El resultado debería verse así:
Como estoy equiparando la eliminación de una columna para seleccionar las otras columnas, la dividiré en dos tipos:
Selección de etiqueta
Comenzamos fabricando la lista / matriz de etiquetas que representan las columnas que queremos conservar y sin las columnas que queremos eliminar.
df.columns.difference(dlst)
np.setdiff1d(df.columns.values, dlst)
df.columns.drop(dlst, errors='ignore')
list(set(df.columns.values.tolist()).difference(dlst))
[x for x in df.columns.values.tolist() if x not in dlst]
Columnas de etiquetas
Para comparar el proceso de selección, suponga:
Entonces podemos evaluar
df.loc[:, cols]
df[cols]
df.reindex(columns=cols)
df.reindex_axis(cols, 1)
Que todos evalúan para:
Boolean Slice
Podemos construir una matriz / lista de booleanos para cortar
~df.columns.isin(dlst)
~np.in1d(df.columns.values, dlst)
[x not in dlst for x in df.columns.values.tolist()]
(df.columns.values[:, None] != dlst).all(1)
Columnas de booleano
En aras de la comparación
df.loc[: bools]
Que todos evalúan para:
Tiempo robusto
Las funciones
Pruebas
Esto es relativo al tiempo que lleva correr
df.drop(dlst, 1, errors='ignore')
. Parece que después de todo ese esfuerzo, solo mejoramos modestamente el rendimiento.De hecho, las mejores soluciones usan
reindex
oreindex_axis
en el pirateolist(set(df.columns.values.tolist()).difference(dlst))
. Un segundo cercano y todavía muy marginalmente mejor de lo quedrop
esnp.setdiff1d
.fuente
La sintaxis de puntos funciona en JavaScript, pero no en Python.
del df['column_name']
del df['column_name']
odel df.column_name
fuente
Si su marco de datos original
df
no es demasiado grande, no tiene restricciones de memoria, y solo necesita mantener unas pocas columnas, entonces también podría crear un nuevo marco de datos con solo las columnas que necesita:fuente
Podemos eliminar o eliminar una columna especificada o columnas sprcified por el método drop () .
Supongamos que df es un marco de datos.
Columna a eliminar = column0
Para eliminar varias columnas col1, col2,. . . , coln, tenemos que insertar todas las columnas que debían eliminarse en una lista. Luego quítelos mediante el método drop ().
Espero que sea de ayuda.
fuente
df = df.drop([col1, col2, . . . , coln], axis=1)
esto no funciona si especifico un nombre de variable en lugar de col1, col2, etc. Obtengo la columna de error no en el eje cuando está definitivamente presente. @Littin ¿Podrías ayudarme?Otra forma de eliminar una columna en Pandas DataFrame
Si no está buscando la eliminación in situ, puede crear un nuevo DataFrame especificando las columnas utilizando la
DataFrame(...)
función comoCrear un nuevo DataFrame como
Obtiene un resultado tan bueno como el que obtiene con del / drop
fuente