2015-06-18 32 views
33

Questa potrebbe essere una domanda stupida, ma come posso aggiungere più colonne vuote a un DataFrame da un elenco?Panda: aggiungere più colonne vuote a DataFrame

posso fare:

df["B"] = None 
df["C"] = None 
df["D"] = None 

Ma non posso fare:

df[["B", "C", "D"]] = None 

KeyError: "['B' 'C' 'D'] not in index" 

risposta

27

avrei concat utilizzando un ctor dataframe:

In [23]: 
df = pd.DataFrame(columns=['A']) 
df 

Out[23]: 
Empty DataFrame 
Columns: [A] 
Index: [] 

In [24]:  
pd.concat([df,pd.DataFrame(columns=list('BCD'))]) 

Out[24]: 
Empty DataFrame 
Columns: [A, B, C, D] 
Index: [] 

Così facendo passare un elenco contenente il tuo df originale e uno nuovo con le colonne che desideri aggiungere, questo restituirà un nuovo df con le colonne aggiuntive.

+0

Grazie, è possibile che mi manca qualcosa, ma ho aggiunto 'pd.concat ([DF, pd.DataFrame (colonne = lista ('BCD'))]) '- non fa niente afaik. Potrebbe essere dovuto al fatto che io uso 'df = pd.read_csv' e non' df = pd.DataFrame'? – Winterflags

+2

È necessario assegnare il risultato della concat così 'df = pd.concat ([df, pd.DataFrame (columns = list ('BCD'))])' – EdChum

+0

Grazie, ha funzionato. Posso aggiungere le colonne all'ultima colonna? Le nuove colonne vengono aggiunte all'inizio. Sembra che concat stia eseguendo il riordino automatico perché anche le mie colonne originali vengono spostate. – Winterflags

33

Si potrebbe utilizzare df.reindex per aggiungere nuove colonne:

In [18]: df = pd.DataFrame(np.random.randint(10, size=(5,1)), columns=['A']) 

In [19]: df 
Out[19]: 
    A 
0 4 
1 7 
2 0 
3 7 
4 6 

In [20]: df.reindex(columns=list('ABCD')) 
Out[20]: 
    A B C D 
0 4 NaN NaN NaN 
1 7 NaN NaN NaN 
2 0 NaN NaN NaN 
3 7 NaN NaN NaN 
4 6 NaN NaN NaN 

reindex restituirà un nuovo dataframe, con colonne che appaiono nell'ordine in cui sono elencati:

In [31]: df.reindex(columns=list('DCBA')) 
Out[31]: 
    D C B A 
0 NaN NaN NaN 4 
1 NaN NaN NaN 7 
2 NaN NaN NaN 0 
3 NaN NaN NaN 7 
4 NaN NaN NaN 6 

Il metodo reindex come fill_value parametro:

In [22]: df.reindex(columns=list('ABCD'), fill_value=0) 
Out[22]: 
    A B C D 
0 4 0 0 0 
1 7 0 0 0 
2 0 0 0 0 
3 7 0 0 0 
4 6 0 0 0 
+0

Dopo aver sperimentato un Data Frame moderatamente grande (~ 2.5k righe per colonne 80k), e questa soluzione sembra essere un ordine di grandezza più veloce di quello accettato.BTW c'è un motivo per cui questo comando specifico non accetta un parametro "inplace = True"? df = df.reindex (...) sembra utilizzare un bel po 'di RAM. –

+1

@MarcoSpinaci: mi raccomando di non usare mai 'inplace = True'.Non fa quello che pensa la maggior parte della gente. Sotto il cofano, viene sempre creato un nuovo DataFrame, quindi i dati del nuovo DataFrame vengono copiati nel DataFrame originale. Ciò non risparmia alcun ricordo. Quindi "inplace = True" è una vetrinistica senza sostanza, e inoltre viene chiamata in modo fuorviante. Non ho controllato il codice, ma mi aspetto che 'df = df.reindex (...)' richieda almeno 2x la memoria richiesta per 'df', e ovviamente di più quando' reindex' viene usato per espandere il numero di filari. – unutbu

3

Se non si vuole riscrivere il nome delle vecchie colonne, quindi è possibile utilizzare reindex:

df.reindex(columns=[*df.columns.tolist(), 'new_column1', 'new_column2'], fill_value=0) 

esempio completa:

In [1]: df = pd.DataFrame(np.random.randint(10, size=(3,1)), columns=['A']) 

In [1]: df 
Out[1]: 
    A 
0 4 
1 7 
2 0 

In [2]: df.reindex(columns=[*df.columns.tolist(), 'col1', 'col2'], fill_value=0) 
Out[2]: 

    A col1 col2 
0 1  0  0 
1 2  0  0 

E, se il numero ha già una lista, con i nomi delle colonne,:

In [3]: my_cols_list=['col1','col2'] 

In [4]: df.reindex(columns=[*df.columns.tolist(), *my_cols_list], fill_value=0) 
Out[4]: 
    A col1 col2 
0 1  0  0 
1 2  0  0 
Problemi correlati