Tengo un DataFrame de pandas con 4 columnas y quiero crear un nuevo DataFrame que solo tenga tres de las columnas. Esta pregunta es similar a: Extraer columnas específicas de un dataframe, pero para pandas no para R. El siguiente código no funciona, genera un error y ciertamente no es la forma pandasnica de hacerlo.
import pandas as pd old = pd.DataFrame({'A' : [4,5], 'B' : [10,20], 'C' : [100,50], 'D' : [-30,-50]}) new = pd.DataFrame(zip(old.A, old.C, old.D)) # raises TypeError: data argument can't be an iterator
¿Cuál es la forma pandasnica de hacerlo?
Hay una forma de hacer esto y en realidad se parece a R
new = old[['A', 'C', 'D']].copy()
Aquí solo está seleccionando las columnas que desea del dataframe original y creando una variable para esas. Si desea modificar el nuevo dataframe, probablemente desee usar .copy()
para evitar un SettingWithCopyWarning
.
Un método alternativo es utilizar el filter
que creará una copia de forma predeterminada:
new = old.filter(['A','B','D'], axis=1)
Finalmente, dependiendo de la cantidad de columnas en su dataframe original, podría ser más conciso express esto usando una drop
(esto también creará una copia por defecto):
new = old.drop('B', axis=1)
Otra forma más simple parece ser:
new = pd.DataFrame ([old.A, old.B, old.C]). transpose ()
donde old.column_name te dará una serie. Haga una lista de todas las series de columnas que desea conservar y pásela al constructor DataFrame. Necesitamos hacer una transposición para ajustar la forma.
In [14]:pd.DataFrame([old.A,old.B,old.C]).transpose() Out[14]: ABC 0 4 10 100 1 5 20 50
Forma funcional genérica
def select_columns(data_frame, column_names): new_frame = data_frame.loc[:, column_names] return new_frame
Específico para su problema anterior
selected_columns = ['A', 'C', 'D'] new = select_columns(old, selected_columns)