2015-04-15 12 views
5

Dati due DF con indici non univoci e colonne multidimensionali:Unire più dataframes con indici non univoci

ars:

  arsenal arsenal arsenal arsenal 
NaN    B3  SK  BX  BY 
2015-04-15  NaN  NaN  NaN  26.0 
2015-04-14  NaN  NaN  NaN  NaN 
2015-04-13 26.0  26.0  23.0  NaN 
2015-04-13 22.0  21.0  19.0  NaN 

Che:

  chelsea chelsea chelsea chelsea 
NaN    B3  SK  BX  BY 
2015-04-15  NaN  NaN  NaN  1.01 
2015-04-14 1.02  NaN  NaN  NaN 
2015-04-14  NaN  1.05  NaN  NaN 

qui in formato csv

,arsenal,arsenal,arsenal,arsenal 
,B3,SK,BX,BY 
2015-04-15,,,,26.0 
2015-04-14,,,, 
2015-04-13,26.0,26.0,23.0, 
2015-04-13,22.0,21.0,19.0, 

,chelsea,chelsea,chelsea,chelsea 
,B3,SK,BX,BY 
2015-04-15,,,,1.01 
2015-04-14,1.02,,, 
2015-04-14,,1.05,, 

Mi piacerebbe unirmi/unirli, una sorta di join esterno in modo che le righe non vengano eliminate.

vorrei l'output di essere:

  arsenal arsenal arsenal arsenal chelsea chelsea chelsea chelsea 
NaN    B3  SK  BX  BY  B3  SK  BX  BY 
2015-04-15  NaN  NaN  NaN  26.0  NaN  NaN  NaN  1.01 
2015-04-14  NaN  NaN  NaN  NaN 1.02  NaN  NaN  NaN 
2015-04-14  NaN  NaN  NaN  NaN  NaN  1.05  NaN  NaN 
2015-04-13 26.0  26.0  23.0  NaN  NaN  NaN  NaN  NaN 
2015-04-13 22.0  21.0  19.0  NaN  NaN  NaN  NaN  NaN 

Nessuno degli strumenti di panda che conosco lavorato: merge, join, concat. L'outer join di merge fornisce un prodotto punto che non è quello che sto cercando, mentre concat non può gestire indici non univoci.

Avete qualche idea su come raggiungere questo obiettivo?

Nota: le lunghezze dei dataframes non saranno identiche.

risposta

1

Sono riuscito a sistemalo usando il metodo concat dei panda.

In primo luogo, abbiamo bisogno di aggiungere un livello Multiindex in modo che diventi unica:

ars = pd.read_csv("ars.csv", index_col=[0], header=[0,1]) 
che = pd.read_csv("che.csv", index_col=[0], header=[0,1]) 

ars.index.name = "date" 
ars["num"] = range(0, len(ars.index)) 
ars = ars.set_index("num", append=True) 

che.index.name = "date" 
che["num"] = range(0, len(che.index)) 
che = che.set_index("num", append=True) 

Ora possiamo usare concat:

df = pd.concat([ars, che], axis=1) 
df = df.reset_index() 
df = df.sort_index(by=["date", "num"], ascending=[False, True]) 
df = df.set_index(["date", "num"]) 
df.index = df.index.droplevel(1) 

uscita:

   arsenal    chelsea     
       B3 SK BX BY  B3 SK BX BY 
date             
2015-04-15  NaN NaN NaN 26  NaN NaN NaN 1.01 
2015-04-14  NaN NaN NaN NaN 1.02 NaN NaN NaN 
2015-04-14  NaN NaN NaN NaN  NaN 1.05 NaN NaN 
2015-04-13  26 26 23 NaN  NaN NaN NaN NaN 
2015-04-13  22 21 19 NaN  NaN NaN NaN NaN 
2

Si vuole utilizzare l'argomento on='outer' per join (test1.csv e test2.csv sono i file che hai dato):

df1 = pd.read_csv('test1.csv', index_col=0, header=[0,1]) 
df2 = pd.read_csv('test2.csv', index_col=0, header=[0,1]) 

df = df1.join(df2, how='outer') 

questo è il risultato che ottengo:

  arsenal    chelsea 
       B3 SK BX BY  B3 SK BX BY 
2015-04-13  26 26 23 NaN  NaN NaN NaN NaN 
2015-04-14  NaN NaN NaN NaN 1.02 NaN NaN NaN 
2015-04-14  NaN NaN NaN NaN  NaN 1.05 NaN NaN 
2015-04-15  NaN NaN NaN 26  NaN NaN NaN 1.01 
+0

Hi, thx per l'input. Ha funzionato in questo esempio, dove le lunghezze dei frame erano indifferenti. Tuttavia, non è garantito nel mio caso. –

+0

L'ho provato con diversi numeri di file e sembrava funzionare bene. – TheBlackCat