varias seleccionar renombrar columnas columna python pandas

python - renombrar - Seleccionar/excluir conjuntos de columnas en pandas



seleccionar dos columnas en python (7)

A continuación, se DataFrame cómo crear una copia de un DataFrame excluyendo una lista de columnas:

df = pd.DataFrame(np.random.randn(100, 4), columns=list(''ABCD'')) df2 = df.drop([''B'', ''D''], axis=1)

¡Pero ten cuidado! Menciona puntos de vista en su pregunta, sugiriendo que si cambió df , también querría que df2 cambiara. (Como una vista en una base de datos)

Este método no logra eso:

>>> df.loc[0, ''A''] = 999 # Change the first value in df >>> df.head(1) A B C D 0 999 -0.742688 -1.980673 -0.920133 >>> df2.head(1) # df2 is unchanged. It''s not a view, it''s a copy! A C 0 0.251262 -1.980673

Tenga en cuenta también que esto también es cierto para el método de @ piggybox. (Aunque ese método es bueno y astuto y Pythonic. ¡¡No lo estoy haciendo !!)

Para obtener más información sobre las vistas y las copias, vea esta respuesta SO y esta parte de los documentos de Pandas a la que se refiere esa respuesta.

Me gustaría crear vistas o marcos de datos a partir de un marco de datos existente en función de las selecciones de columnas.

Por ejemplo, me gustaría crear un marco de datos df2 a partir de un marco de datos df1 que contenga todas las columnas, excepto dos de ellos. Intenté hacer lo siguiente, pero no funcionó:

import numpy as np import pandas as pd # Create a dataframe with columns A,B,C and D df = pd.DataFrame(np.random.randn(100, 4), columns=list(''ABCD'')) # Try to create a second dataframe df2 from df with all columns except ''B'' and D my_cols = set(df.columns) my_cols.remove(''B'').remove(''D'') # This returns an error ("unhashable type: set") df2 = df[my_cols]

¿Qué estoy haciendo mal? Tal vez de forma más general, ¿qué mecanismos tiene Panda para respaldar la selección y exclusión de conjuntos arbitrarios de columnas a partir de un marco de datos?


Del mismo modo, al leer un archivo, muchos desearán excluir columnas por adelantado, en lugar de leer datos no deseados en la memoria y luego descartarlos.

A partir de pandas 0.20.0, usecols ahora acepta usecols . 1 Esta actualización permite opciones más flexibles para leer columnas:

skipcols = [...] read_csv(..., usecols=lambda x: x not in skipcols)

Este último patrón es esencialmente el inverso del método tradicional de usecols : solo se omiten las columnas especificadas.

Dado

Datos en un archivo

import numpy as np import pandas as pd df = pd.DataFrame(np.random.randn(100, 4), columns=list(''ABCD'')) filename = "foo.csv" df.to_csv(filename)

Código

skipcols = ["B", "D"] df1 = pd.read_csv(filename, usecols=lambda x: x not in skipcols, index_col=0) df1

Salida

A C 0 0.062350 0.076924 1 -0.016872 1.091446 2 0.213050 1.646109 3 -1.196928 1.153497 4 -0.628839 -0.856529 ...

Detalles

El DataFrame se escribió en un archivo y se volvió a leer como DataFrame por separado, ahora omitiendo las columnas no deseadas.

Tenga en cuenta que para la situación del OP, dado que los datos ya están creados, el mejor enfoque es la respuesta aceptada, que elimina las columnas no deseadas de un objeto existente. Sin embargo, la técnica presentada aquí es más útil cuando se leen directamente datos de archivos en un DataFrame.

Se planteó una solicitud para una opción de "skipcols" en este tema y se abordó en un número más reciente.


Hay un nuevo método de índice llamado difference . Devuelve las columnas originales, con las columnas pasadas como argumento eliminado.

df2 = df[df.columns.difference([''B'', ''D''])]

Aquí, la salida se usa para filtrar las columnas B y D de df .


Puede soltar las columnas que no necesita O seleccionar las que necesita

##Using DataFrame.drop df.drop(df.columns[[1, 2]], axis=1, inplace=True) # drop by Name df1 = df1.drop([''B'', ''C''], axis=1) ## Select the ones you want df1 = df[[''a'',''d'']]


Realmente no necesita convertir eso en un conjunto:

cols = [col for col in df.columns if col not in [''B'', ''D'']] df2 = df[cols]


Solo necesitas convertir tu set a una list

import pandas as pd df = pd.DataFrame(np.random.randn(100, 4), columns=list(''ABCD'')) my_cols = set(df.columns) my_cols.remove(''B'') my_cols.remove(''D'') my_cols = list(my_cols) df2 = df[my_cols]


También eche un vistazo a la función DataFrame.filter incorporada.

Enfoque minimalista pero codicioso (suficiente para el df dado):

df.filter(regex="[^BD]")

Enfoque conservador / perezoso (solo coincidencias exactas):

df.filter(regex="^(?!(B|D)$).*$")

Conservador y genérico

exclude_cols = [''B'',''C''] df.filter(regex="^(?!({0})$).*$".format(''|''.join(exclude_cols)))