Extracción de columnas seleccionadas específicas a un nuevo DataFrame como una copia

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)