Come aggiungere una colonna vuota a un frame di dati?


262

Qual è il modo più semplice per aggiungere una colonna vuota a un DataFrameoggetto Panda ? Il migliore su cui mi sono imbattuto è qualcosa di simile

df['foo'] = df.apply(lambda _: '', axis=1)

Esiste un metodo meno perverso?


2
Vuoi davvero una colonna contenente stringhe vuote o meglio N/A?
film

Risposte:


420

Se ho capito bene, l'incarico dovrebbe riempire:

>>> import numpy as np
>>> import pandas as pd
>>> df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
>>> df
   A  B
0  1  2
1  2  3
2  3  4
>>> df["C"] = ""
>>> df["D"] = np.nan
>>> df
   A  B C   D
0  1  2   NaN
1  2  3   NaN
2  3  4   NaN

2
Questa risposta ha appena creato nuove righe per me.
logicbloke,

@logicbloke puoi fornire un esempio di ciò che sta accadendo?
Craymichael,

@craymichael È passato un po 'di tempo, ma credo di avere colonne indicizzate da numeri senza nomi e righe con nome e alla fine ha appena creato una nuova riga.
logicbloke,

1
Se dfè vuoto, potresti voler utilizzare df['new'] = pd.Series() (vedi la mia risposta di seguito)
Carsten

come aggiungere più colonne vuote?
M. Mariscal,

46

Per aggiungere la risposta di DSM e basarsi su questa domanda associata , dividerei l'approccio in due casi:

  • Aggiunta di una singola colonna: basta assegnare valori vuoti alle nuove colonne, ad es df['C'] = np.nan

  • Aggiunta di più colonne: suggerirei di utilizzare il .reindex(columns=[...]) metodo dei panda per aggiungere le nuove colonne all'indice di colonna del frame di dati. Questo funziona anche per l'aggiunta di più nuove righe con .reindex(rows=[...]). Si noti che le versioni più recenti di Panda (v> 0.20) consentono di specificare una axisparola chiave anziché assegnare esplicitamente a columnso rows.

Ecco un esempio di aggiunta di più colonne:

mydf = mydf.reindex(columns = mydf.columns.tolist() + ['newcol1','newcol2'])

o

mydf = mydf.reindex(mydf.columns.tolist() + ['newcol1','newcol2'], axis=1)  # version > 0.20.0

Puoi anche concatenare sempre un nuovo (vuoto) frame di dati al frame di dati esistente, ma per me non mi sembra pitone :)


3
L'esempio per version >= 0.20.0cancella DataFrame e aggiunge le nuove colonne come righe. Esempio per version < 0.20.0lavori su Pandas Version0.24.1
Lalo

@emunsing Durante la ricerca di una risposta a questa domanda, alla fine ho trovato utile la tua risposta. In un primo momento, tuttavia, non funzionava per me come Panda richiede , axis=1in version = 0.25. Ho provato a modificare la tua risposta per includere la versione aggiornata, ma sono stato rifiutato da @kenlukas e @il_raffa. Spero che tutti faticano a capire perché la tua risposta non funziona per loro - come me - almeno si imbatte in questo commento.
Griff

@Griff - Ora ho aggiornato la mia risposta per essere più preciso ed esplicito sui problemi di compatibilità della versione. Grazie per averlo evidenziato.
esercitando il

35

una soluzione ancora più semplice è:

df = df.reindex(columns = header_list)                

dove "header_list" è un elenco delle intestazioni che si desidera visualizzare.

qualsiasi intestazione inclusa nell'elenco che non si trova già nel frame di dati verrà aggiunta con celle vuote in basso.

quindi se

header_list = ['a','b','c', 'd']

quindi c e d verranno aggiunti come colonne con celle vuote


2
Più precisamente, le colonne verranno aggiunte con NaN.
broccoli2000

19

A partire da v0.16.0, DF.assign()potrebbe essere utilizzato per assegnare nuove colonne ( singole / multiple ) a DF. Queste colonne vengono inserite in ordine alfabetico alla fine di DF.

Ciò diventa vantaggioso rispetto alla semplice assegnazione nei casi in cui si desidera eseguire una serie di operazioni concatenate direttamente sul frame di dati restituito.

Considera lo stesso DFesempio dimostrato da @DSM:

df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
df
Out[18]:
   A  B
0  1  2
1  2  3
2  3  4

df.assign(C="",D=np.nan)
Out[21]:
   A  B C   D
0  1  2   NaN
1  2  3   NaN
2  3  4   NaN

Si noti che questo restituisce una copia con tutte le colonne precedenti insieme a quelle appena create. Affinché l'originale DFvenga modificato di conseguenza, utilizzarlo come segue: df = df.assign(...)poiché al momento non supporta l' inplaceoperazione.


Cos'è quel tipo di dati per C? Sto cercando di aggiungere eseguendo il ciclo attraverso un elenco di stringhe. Ma non lo usa.
Eleijonmarck,

12

Mi piace:

df['new'] = pd.Series(dtype='your_required_dtype')

Se si dispone di un frame di dati vuoto, questa soluzione si assicura che non NaNvenga aggiunta alcuna nuova riga contenente solo .

Se dtypenon specificato, le versioni Pandas più recenti producono a DeprecationWarning.


5

se si desidera aggiungere il nome della colonna da un elenco

df=pd.DataFrame()
a=['col1','col2','col3','col4']
for i in a:
    df[i]=np.nan

4

La risposta di @ emunsing è davvero interessante per l'aggiunta di più colonne, ma non sono riuscito a farlo funzionare per me in Python 2.7. Invece, ho trovato che funziona:

mydf = mydf.reindex(columns = np.append( mydf.columns.values, ['newcol1','newcol2'])

1

Il codice seguente risponde alla domanda "Come faccio ad aggiungere n numero di colonne vuote al mio frame di dati esistente". Nell'interesse di conservare soluzioni a problemi simili in un unico posto, lo sto aggiungendo qui.

Approccio 1 (per creare 64 colonne aggiuntive con nomi di colonna da 1-64)

m = list(range(1,65,1)) 
dd=pd.DataFrame(columns=m)
df.join(dd).replace(np.nan,'') #df is the dataframe that already exists

Approccio 2 (per creare 64 colonne aggiuntive con nomi di colonna da 1-64)

df.reindex(df.columns.tolist() + list(range(1,65,1)), axis=1).replace(np.nan,'')

1

Tu puoi fare

df['column'] = None #This works. This will create a new column with None type
df.column = None #This will work only when the column is already present in the dataframe 

1

Si può usare df.insert(index_to_insert_at, column_header, init_value)per inserire una nuova colonna in un indice specifico.

cost_tbl.insert(1, "col_name", "") 

L'istruzione precedente inserirà una colonna vuota dopo la prima colonna.

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.