Estrazione di colonne selezionate specifiche nel nuovo DataFrame come copia


185

Ho un DataFrame Panda con 4 colonne e voglio creare un nuovo DataFrame che ha solo tre delle colonne. Questa domanda è simile a: Estrarre colonne specifiche da un frame di dati ma per i panda non R. Il seguente codice non funziona, genera un errore e non è certamente il modo pandasnico di farlo.

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 

Qual è il modo pandasnico di farlo?

Risposte:


359

C'è un modo per farlo e in realtà sembra simile a R

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

Qui stai solo selezionando le colonne che desideri dal frame di dati originale e creando una variabile per quelle. Se vuoi modificare il nuovo frame di dati, probabilmente vorrai utilizzare .copy()per evitare a SettingWithCopyWarning.

Un metodo alternativo è utilizzare filterche creerà una copia per impostazione predefinita:

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

Infine, a seconda del numero di colonne nel tuo dataframe originale, potrebbe essere più conciso esprimerlo usando un drop(questo creerà anche una copia di default):

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

20
Un avvertimento se si copia solo una colonna: In old[['A']].copy(), le parentesi quadre doppie sono necessarie per creare un nuovo frame di dati. Nota che old['A'].copy()creerà solo una serie.
intotecho,


8

Un altro modo più semplice sembra essere:

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

dove old.column_nameti darà una serie. Crea un elenco di tutte le serie di colonne che desideri conservare e passale al costruttore DataFrame. Dobbiamo fare una trasposizione per regolare 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

funziona, ma non se il nome_colonna ha caratteri speciali.
jimh

oh non ci avevo pensato
Hit

3

Forma funzionale generica

def select_columns(data_frame, column_names):
    new_frame = data_frame.loc[:, column_names]
    return new_frame

Specifico per il tuo problema sopra

selected_columns = ['A', 'C', 'D']
new = select_columns(old, selected_columns)

2

Se vuoi avere un nuovo frame di dati, allora:

import pandas as pd
old = pd.DataFrame({'A' : [4,5], 'B' : [10,20], 'C' : [100,50], 'D' : [-30,-50]})
new=  old[['A', 'C', 'D']]

1

Per quanto ne so, non è necessario specificare l'asse quando si utilizza la funzione filtro.

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

restituisce lo stesso frame di dati di

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

1

colonne per indice:

# selected column index: 1, 6, 7
new = old.iloc[: , [1, 6, 7]].copy() 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.