2015-01-30 19 views
23

Sto cercando di unire inner DataFrame A a DataFrame B e sto correndo in un errore.Python Pandas inner join

Ecco la mia dichiarazione join:

merged = DataFrameA.join(DataFrameB, on=['Code','Date']) 

Ed ecco l'errore:

ValueError: len(left_on) must equal the number of levels in the index of "right" 

io non sono sicuro che le questioni di ordine di colonna (non sono veramente "ordinato" sono?) , ma solo nel caso, i DataFrames sono organizzate in questo modo:

DataFrameA: Code, Date, ColA, ColB, ColC, ..., ColG, ColH (shape: 80514, 8 - no index) 
DataFrameB: Date, Code, Col1, Col2, Col3, ..., Col15, Col16 (shape: 859, 16 - no index) 

devo correggere il mio join? O c'è un altro, un modo migliore per ottenere l'intersezione (o inner join) di questi due DataFrames?

+0

Solo una cosa da sottolineare, tecnicamente tutti i DFS e serie e pannelli per quella materia avranno un indice, non può essere uno che hai impostato, ma ce n'è sempre uno, probabilmente int64 a partire da 0. – EdChum

+0

totalmente a destra. Non ero sicuro di come dirlo in modo sintetico. Indice standard? Indice di default? –

risposta

27

uso merge se non stanno unendo sull'indice:

merged = pd.merge(DataFrameA,DataFrameB, on=['Code','Date']) 

seguito alla domanda qui sotto:

Ecco un esempio replicabile:

import pandas as pd 
# create some timestamps for date column 
i = pd.to_datetime(pd.date_range('20140601',periods=2)) 

#create two dataframes to merge 
df = pd.DataFrame({'code': ['ABC','EFG'], 'date':i,'col1': [10,100]}) 
df2 = pd.DataFrame({'code': ['ABC','EFG'], 'date':i,'col2': [10,200]}) 

#merge on columns (default join is inner) 
pd.merge(df, df2, on =['code','date']) 

Il risultato è :

code col1 date col2 
0 ABC  10  2014-06-01 10 
1 EFG  100  2014-06-02 200 

Cosa succede quando si esegue questo codice?

+0

unione ha anche un argomento per tipo di join, come: {'left', 'right', 'outer', 'inner'}, default 'inner' – flyingmeatball

7

Ecco un altro modo di eseguire join. A differenza della risposta verificata, questa è una risposta più generale applicabile a per tutti gli altri tipi di join.

INNER JOIN

inner join può anche essere eseguita da menzionare in modo esplicito come segue in how:

pd.merge(df1, df2, on='column_name', how='inner') 

Gli stessi aplies metodologia per gli altri tipi di join:

join esterno

pd.merge(df1, df2, on='column_name', how='outer') 

LEFT JOIN

pd.merge(df1, df2, on='column_name', how='left') 

destro Registrazione

pd.merge(df1, df2, on='column_name', how='right')