Combinazione di due serie in un DataFrame in panda


278

Ho due serie s1e s2con gli stessi indici (non consecutivi). Come faccio a combinare s1e s2ad essere due colonne in un DataFrame e mantenere uno degli indici come terza colonna?

Risposte:


417

Penso che concatsia un bel modo per farlo. Se presenti, utilizza gli attributi del nome della serie come colonne (altrimenti li numera semplicemente):

In [1]: s1 = pd.Series([1, 2], index=['A', 'B'], name='s1')

In [2]: s2 = pd.Series([3, 4], index=['A', 'B'], name='s2')

In [3]: pd.concat([s1, s2], axis=1)
Out[3]:
   s1  s2
A   1   3
B   2   4

In [4]: pd.concat([s1, s2], axis=1).reset_index()
Out[4]:
  index  s1  s2
0     A   1   3
1     B   2   4

Nota: questo si estende a più di 2 serie.


5
questo in realtà evita anche la copia (rispetto alla soluzione dict)
Jeff

In un caso, sembra che mi dica "ValueError: il valore di verità di un array con più di un elemento è ambiguo. Usa a.any () o a.all () '- qualche idea?
user7289

@ user7289 non sei sicuro di dove verrebbe, potresti fare questa domanda come un'altra domanda?
Andy Hayden,

@AndyHayden: cosa succede se ci sono duplicati lungo uno o entrambi gli indici?
Mannaggia,

2
@dafinguzman significa che "riutilizzare costantemente questa funzione" è che dovresti preferire fare il concat una volta pd.concat([list_of_dataframes]) rispetto alla concation molte volte new_df = pd.DataFrame(); for df in list_of_dsf: new_df = pd.concat([new_df, df])o simili.
Andy Hayden,

38

Perché non usi semplicemente .to_frame se entrambi hanno gli stessi indici?

> = v0.23

a.to_frame().join(b)

< v0.23

a.to_frame().join(b.to_frame())

4
Forse questo sarebbe più appropriato: a.to_frame (name = 'a'). Join (b.to_frame (name = 'b'))
user3282777

33

I panda allineeranno automaticamente questi passaggi in serie e creeranno l'indice congiunto. Qui capita di essere lo stesso. reset_indexsposta l'indice in una colonna.

In [2]: s1 = Series(randn(5),index=[1,2,4,5,6])

In [4]: s2 = Series(randn(5),index=[1,2,4,5,6])

In [8]: DataFrame(dict(s1 = s1, s2 = s2)).reset_index()
Out[8]: 
   index        s1        s2
0      1 -0.176143  0.128635
1      2 -1.286470  0.908497
2      4 -0.995881  0.528050
3      5  0.402241  0.458870
4      6  0.380457  0.072251

16

Codice di esempio:

a = pd.Series([1,2,3,4], index=[7,2,8,9])
b = pd.Series([5,6,7,8], index=[7,2,8,9])
data = pd.DataFrame({'a': a,'b':b, 'idx_col':a.index})

Panda consente di creare un DataFrameda a dictcon Seriesi valori e i nomi delle colonne come chiavi. Quando trova un Seriesvalore, utilizza l' Seriesindice come parte DataFramedell'indice. Questo allineamento dei dati è uno dei principali vantaggi di Panda. Di conseguenza, a meno che tu non abbia altre esigenze, il valore appena creato DataFrameha un valore duplicato. Nell'esempio sopra, data['idx_col']ha gli stessi dati di data.index.


13

Se potessi rispondere a questa domanda.

I fondamenti dietro la conversione delle serie in un data frame è quello di capirlo

1. A livello concettuale, ogni colonna nel frame di dati è una serie.

2. Inoltre, ogni nome di colonna è un nome chiave associato a una serie.

Se tieni a mente due concetti sopra, puoi pensare a molti modi per convertire le serie in frame di dati. Una soluzione semplice sarà così:

Crea due serie qui

import pandas as pd

series_1 = pd.Series(list(range(10)))

series_2 = pd.Series(list(range(20,30)))

Crea un frame di dati vuoto con solo i nomi di colonna desiderati

df = pd.DataFrame(columns = ['Column_name#1', 'Column_name#1'])

Inserisci il valore della serie nel frame di dati usando il concetto di mapping

df['Column_name#1'] = series_1

df['Column_name#2'] = series_2

Controlla i risultati ora

df.head(5)

6

Non sono sicuro di aver compreso appieno la tua domanda, ma è questo ciò che vuoi fare?

pd.DataFrame(data=dict(s1=s1, s2=s2), index=s1.index)

( index=s1.indexnon è nemmeno necessario qui)



1

Ho usato i panda per convertire il mio array numpy o iseries in un frame di dati, quindi ho aggiunto e aggiunto la colonna aggiuntiva per chiave come 'previsione'. Se è necessario riconvertire i frame di dati in un elenco, utilizzare valori.tolist ()

output=pd.DataFrame(X_test)
output['prediction']=y_pred

list=output.values.tolist()     
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.