2016-06-22 14 views
5

Ho 2 DataFrames che vorrei unire. Ho esaminato la documentazione e ho cercato di eseguire la seguente operazione, ma mi sono confuso su come farlo. Come ho detto ho 2 DataFrames:Unione di due DataFrames

df1: 

     id  name type currency 
0 BTA.S Applewood Hard  GBp 
1 VOD.S Softwood Soft  GBp 

e

df2: 

    id 
BTA.S 301.221525 
VOD.S 213.791400 

e mi piacerebbe tornare:

 id  name type currency  price 
0 BTA.S Applewood Hard  GBp 301.221525 
1 VOD.S Softwood Soft  GBp 213.791400 

Dove la colonna prezzo del DF2 è fusa con df1. (Solo per farti sapere che ci saranno molti altri tipi di legno quando avrò finito).

ho provato un paio di metodi per farlo:

Result = df1.merge(df2[['*.S']], left_on='id', right_index=True) 

dove ho incontrato l'eccezione:

ValueError: can not merge DataFrame with instance of type <class 'pandas.core.series.Series'> 

e

Result = pd.concat([Df1, Df2], axis=1, ignore_index=True) 

dove ottengo l'eccezione:

ValueError: labels ['type'] not contained in axis 

Ma mi sto confondendo. Scusa se questa è una domanda di base. Qualsiasi aiuto sarebbe molto apprezzato. Molte grazie

risposta

16

Il messaggio di errore indica che df2 è di tipo pd.Series. È necessario convertire df2.to_frame() come .merge() ha bisogno di un pd.DataFrame() ingresso (see docs):

df1.merge(df2[['*.S']].to_frame(), left_on='id', right_index=True) 

mentre probabilmente anche appena poteva:

df1.merge(df2.to_frame(), left_on='id', right_index=True) 

In alternativa, è possibile utilizzare pd.DataFrame.join() che accetta un pd.Series.

2

Questo errore indica che uno dei tuoi oggetti è non un frame dati panda.

ValueError: can not merge DataFrame with instance of type <class 'pandas.core.series.Series'> 

Per dimostrare questo a te stesso,

print(type(df2)) 

E che dovrebbe uscita pandas.core.series.Series

Per ottenere il risultato desiderato,

df2 = df2.to_frame().reset_index() 
df2.columns = ['id', 'price'] 
df1.merge(df2) 

Uscite:

id name type currency price 
0 BTA.S Applewood Hard GBp  301.221525 
1 VOD.S Softwood Soft GBp  213.791400 
1

Si può semplicemente aggiungere DF2 (che è una serie, non un dataframe) come nuova colonna

df['price']=df2