Aggiungi colonna al dataframe panda


104

Questo è probabilmente facile, ma ho i seguenti dati:

Nel frame di dati 1:

index dat1
0     9
1     5

Nel data frame 2:

index dat2
0     7
1     6

Voglio un data frame con la seguente forma:

index dat1  dat2
0     9     7
1     5     6

Ho provato a utilizzare il appendmetodo, ma ottengo un cross join (cioè prodotto cartesiano).

Qual è il modo giusto per farlo?


2
Hai provato il joinmetodo?
BrenBarn

1
data_frame_1 ['dat2'] = data_frame_2 ['dat2']
lowtech

@lowtech: questo garantisce che gli indici siano accoppiati correttamente?
BenDundee

@BenDundee: sì lo fa
lowtech

Risposte:


132

Sembra che in generale tu stia solo cercando un join:

> dat1 = pd.DataFrame({'dat1': [9,5]})
> dat2 = pd.DataFrame({'dat2': [7,6]})
> dat1.join(dat2)
   dat1  dat2
0     9     7
1     5     6

45
O pd.concat([dat1, dat2], axis=1)in questo caso.
DSM

2
@BenDundee Join e concat usano molto dello stesso codice sotto il cofano, quindi il modo "giusto" probabilmente conta solo quando si considerano i casi limite. Ad esempio, qui se entrambi i DataFrame avessero una colonna "dati" il join fallirebbe , mentre un concatenamento ti darebbe due colonne denominate "dati".
U2EF1

@ U2EF1: stavo parlando della tua risposta contro la mia. Ci sono sempre N modi per
scuoiare

@ BenDundee vedo. Questo metodo elimina l'indice univoco e ha effetti collaterali ancora più strani in casi più complicati, però. Ad esempio, se avessi due colonne denominate "dati", il raggruppamento / la somma inizierebbe a riassumere le diverse colonne di dati, che quasi certamente non è quello che desideri. I dati delle stringhe verrebbero concatenati.
U2EF1

1
Come indicato da @ jeremy-z, è molto importante reimpostare gli indici in entrambi i set di dati se non condividono lo stesso indice. Altrimenti otterrai un set di dati con molte righe NaNs.
Israel Varea

57

Puoi anche usare:

dat1 = pd.concat([dat1, dat2], axis=1)

1
Nel caso in cui incontri InvalidIndexError: Reindexing only valid with uniquely valued Index objects , puoi utilizzare:pd.concat([dat1.reset_index(), dat2], axis=1)
beyondfloatingpoint

40

Sia join()e concat()modo potrebbe risolvere il problema. Tuttavia, c'è un avvertimento che devo menzionare: reimposta l'indice prima di te join()o concat()se stai cercando di gestire alcuni frame di dati selezionando alcune righe da un altro DataFrame.

Un esempio di seguito mostra alcuni comportamenti interessanti di join e concat:

dat1 = pd.DataFrame({'dat1': range(4)})
dat2 = pd.DataFrame({'dat2': range(4,8)})
dat1.index = [1,3,5,7]
dat2.index = [2,4,6,8]

# way1 join 2 DataFrames
print(dat1.join(dat2))
# output
   dat1  dat2
1     0   NaN
3     1   NaN
5     2   NaN
7     3   NaN

# way2 concat 2 DataFrames
print(pd.concat([dat1,dat2],axis=1))
#output
   dat1  dat2
1   0.0   NaN
2   NaN   4.0
3   1.0   NaN
4   NaN   5.0
5   2.0   NaN
6   NaN   6.0
7   3.0   NaN
8   NaN   7.0

#reset index 
dat1 = dat1.reset_index(drop=True)
dat2 = dat2.reset_index(drop=True)
#both 2 ways to get the same result

print(dat1.join(dat2))
   dat1  dat2
0     0     4
1     1     5
2     2     6
3     3     7


print(pd.concat([dat1,dat2],axis=1))
   dat1  dat2
0     0     4
1     1     5
2     2     6
3     3     7

Ben detto e buon punto. Ho provato senza reimpostare l'indice e ho generato un sacco di NULL
Anand

Senza eseguire il passaggio di ripristino, i miei dati sembravano buoni e buoni, ma ovviamente qualcosa non funzionava bene dietro le quinte. Grazie per segnalarlo! Il ripristino ha messo in funzione il mio modello!
Ionuț Ciuta

Questa dovrebbe essere la risposta accettata! Genera sempre NaN se non ripristiniamo index.
Srivatsan

Questo passaggio mi ha salvato. Stavo cercando di capire perché concatenare e partecipare stessero generando molti NaN. Grazie per aver condiviso questo.
Gustavo Rottgering

0

È un dato di fatto:

data_joined = dat1.join(dat2)
print(data_joined)

-3

Solo una questione di ricerca Google corretta:

data = dat_1.append(dat_2)
data = data.groupby(data.index).sum()
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.