2016-03-29 16 views
7

Ho le seguenti due dataframes che ho impostare la data di DateTime Index df.set_index(pd.to_datetime(df['date']), inplace=True) e vorrebbe unire o unire in data:Pandas: Unire frame di dati sull'indice datetime

df.head(5) 
     catcode_amt type feccandid_amt amount 
date     
1915-12-31 A5000 24K  H6TX08100 1000 
1916-12-31 T6100 24K  H8CA52052 500 
1954-12-31 H3100 24K  S8AK00090 1000 
1985-12-31 J7120 24E  H8OH18088 36 
1997-12-31 z9600 24K  S6ND00058 2000 


d.head(5) 
     catcode_disp disposition feccandid_disp bills 
date     
2007-12-31 A0000 support  S4HI00011    1 
2007-12-31 A1000 oppose  S4IA00020', 'P20000741 1 
2007-12-31 A1000 support  S8MT00010    1 
2007-12-31 A1500 support  S6WI00061    2 
2007-12-31 A1600 support  S4IA00020', 'P20000741 3 

Ho provato i seguenti due metodi ma entrambi restituiscono un MemoryError:

df.join(d, how='right') 

io uso il codice qui sotto sul dataframes che dont hanno data fissata da indicizzare.

merge=pd.merge(df,d, how='inner', on='date') 
+2

Il tuo problema qui è che hai date doppie in modo che la combinazione delle righe duplicate sia introduci ng un sacco di righe aggiuntive in quanto non esiste una mappatura 1-1 – EdChum

+0

Grazie EdChum! Non avevo notato la fonte del problema. Ho deciso di abbandonare le date su 'd' e unirmi su' catcode'. Funziona bene! –

risposta

6

È possibile aggiungere parametri left_index=True e right_index=True se avete bisogno di unire da indici in funzione merge:

merge=pd.merge(df,d, how='inner', left_index=True, right_index=True) 

campione (primo valore dell'indice in d è stato modificato per la corrispondenza):

print df 
      catcode_amt type feccandid_amt amount 
date            
1915-12-31  A5000 24K  H6TX08100 1000 
1916-12-31  T6100 24K  H8CA52052  500 
1954-12-31  H3100 24K  S8AK00090 1000 
1985-12-31  J7120 24E  H8OH18088  36 
1997-12-31  z9600 24K  S6ND00058 2000 

print d 
      catcode_disp disposition   feccandid_disp bills 
date                 
1997-12-31  A0000  support     S4HI00011 1.0 
2007-12-31  A1000  oppose S4IA00020', 'P20000741 1 NaN 
2007-12-31  A1000  support     S8MT00010 1.0 
2007-12-31  A1500  support     S6WI00061 2.0 
2007-12-31  A1600  support S4IA00020', 'P20000741 3 NaN 

merge=pd.merge(df,d, how='inner', left_index=True, right_index=True) 
print merge 
      catcode_amt type feccandid_amt amount catcode_disp disposition \ 
date                   
1997-12-31  z9600 24K  S6ND00058 2000  A0000  support 

      feccandid_disp bills 
date        
1997-12-31  S4HI00011 1.0 

Oppure è possibile utilizzare concat:

print pd.concat([df,d], join='inner', axis=1) 

date                   
1997-12-31  z9600 24K  S6ND00058 2000  A0000  support 

      feccandid_disp bills 
date        
1997-12-31  S4HI00011 1.0 

EDIT: EdChum è giusto:

aggiungo duplicati dataframe df (ultime 2 valori dell'indice):

print df 
      catcode_amt type feccandid_amt amount 
date            
1915-12-31  A5000 24K  H6TX08100 1000 
1916-12-31  T6100 24K  H8CA52052  500 
1954-12-31  H3100 24K  S8AK00090 1000 
2007-12-31  J7120 24E  H8OH18088  36 
2007-12-31  z9600 24K  S6ND00058 2000 

print d 
      catcode_disp disposition   feccandid_disp bills 
date                 
1997-12-31  A0000  support     S4HI00011 1.0 
2007-12-31  A1000  oppose S4IA00020', 'P20000741 1 NaN 
2007-12-31  A1000  support     S8MT00010 1.0 
2007-12-31  A1500  support     S6WI00061 2.0 
2007-12-31  A1600  support S4IA00020', 'P20000741 3 NaN 

merge=pd.merge(df,d, how='inner', left_index=True, right_index=True) 
print merge 
      catcode_amt type feccandid_amt amount catcode_disp disposition \ 
date                   
2007-12-31  J7120 24E  H8OH18088  36  A1000  oppose 
2007-12-31  J7120 24E  H8OH18088  36  A1000  support 
2007-12-31  J7120 24E  H8OH18088  36  A1500  support 
2007-12-31  J7120 24E  H8OH18088  36  A1600  support 
2007-12-31  z9600 24K  S6ND00058 2000  A1000  oppose 
2007-12-31  z9600 24K  S6ND00058 2000  A1000  support 
2007-12-31  z9600 24K  S6ND00058 2000  A1500  support 
2007-12-31  z9600 24K  S6ND00058 2000  A1600  support 

         feccandid_disp bills 
date           
2007-12-31 S4IA00020', 'P20000741 1 NaN 
2007-12-31     S8MT00010 1.0 
2007-12-31     S6WI00061 2.0 
2007-12-31 S4IA00020', 'P20000741 3 NaN 
2007-12-31 S4IA00020', 'P20000741 1 NaN 
2007-12-31     S8MT00010 1.0 
2007-12-31     S6WI00061 2.0 
2007-12-31 S4IA00020', 'P20000741 3 NaN 
+0

@ jezrael: Ho appena provato il codice che hai raccomandato: sto ancora ricevendo un MemoryError. Hai qualche altra idea? –

+1

Qual è la dimensione della 'RAM'? Qual è la forma dei tuoi DataFrames? 'print df.shape' e' print d.shape'? – jezrael

+0

Il mio 'df.shape'' (389194, 4) 'e il mio' d.shape è (2910, 4) ' –

2

Sembra che le date sono i vostri indici, nel qual caso si desidera unire l'indice, non colonna. Se si dispone di due dataframes, df_1 e df_2:

df_1.merge(df_2, left_index=True, right_index=True, how='inner')

+0

Grazie per il tuo suggerimento. Ho appena provato e sto ancora ricevendo un MemoryError. Hai qualche altra idea? –

+0

provalo con due dataframes che sono un piccolo sottoinsieme di dati, ad esempio le ultime 100 righe di ciascuno. – dmb

Problemi correlati