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

3 minutos de lectura

avatar de usuario
SpeedCoder5

Tengo un DataFrame de pandas con 4 columnas y quiero crear un nuevo marco de datos que solamente tiene tres de las columnas. Esta pregunta es similar a: Extraer columnas específicas de un marco de datos pero para pandas no 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?

avatar de usuario
john chase

Hay una manera de hacer esto y en realidad se ve similar a R

new = old[['A', 'C', 'D']].copy()

Aquí solo está seleccionando las columnas que desea del marco de datos original y creando una variable para ellas. Si desea modificar el nuevo marco de datos, probablemente querrá usar .copy() para evitar un SettingWithCopyWarning.

Un método alternativo es utilizar filter que creará una copia por defecto:

new = old.filter(['A','B','D'], axis=1)

Finalmente, dependiendo de la cantidad de columnas en su marco de datos original, podría ser más breve expresar esto usando un drop (esto también creará una copia por defecto):

new = old.drop('B', axis=1)

  • Una precaución si solo copia una columna: En old[['A']].copy(), los corchetes dobles son necesarios para crear un nuevo marco de datos. Tenga en cuenta que old['A'].copy() solo creará una Serie.

    – intotecho

    1 de febrero de 2019 a las 2:18


La forma más fácil es

new = old[['A','C','D']]

.

  • Esto no es hacer una copia a menos que llames explícitamente a .copy()

    – Silvano

    30 de octubre de 2019 a las 2:23

  • esto copia por defecto.

    – Nguai al

    5 de febrero de 2020 a las 6:49

  • @Nguaial no se especifica el comportamiento de la indexación simple. No sabrás si obtienes una copia o una vista. Consulte la documentación para obtener más detalles: pandas.pydata.org/pandas-docs/stable/user_guide/…

    – Ole Fass

    5 de mayo de 2020 a las 9:38


  • Como se mencionó en el comentario anterior, esto creará una vista y no una copia.

    – le_llama

    22 de junio de 2021 a las 8:57

avatar de usuario
Pegar

Otra forma más simple parece ser:

new = pd.DataFrame([old.A, old.B, old.C]).transpose()

dónde old.column_name le dará una serie. Haga una lista de todas las series de columnas que desea conservar y pásela al constructor de DataFrame. Necesitamos hacer una transposición para ajustar la forma.

In [14]:pd.DataFrame([old.A, old.B, old.C]).transpose()
Out[14]: 
   A   B    C
0  4  10  100
1  5  20   50

  • funciona, pero no si column_name tiene caracteres especiales.

    – jimh

    3 de mayo de 2019 a las 8:32

  • ay no habia pensado en eso

    – Pegar

    3 mayo 2019 a las 11:23

columnas por índice:

# selected column index: 1, 6, 7
new = old.iloc[: , [1, 6, 7]].copy() 

Por lo que puedo decir, no necesariamente necesita especificar el eje cuando usa la función de filtro.

new = old.filter(['A','B','D'])

devuelve el mismo marco de datos que

new = old.filter(['A','B','D'], axis=1)

avatar de usuario
Jeril

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)

avatar de usuario
Dimitris Paraschakis

Como alternativa:

new = pd.DataFrame().assign(A=old['A'], C=old['C'], D=old['D'])

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad