Pandas Merge (pd.merge) Cómo configurar el índice y unirse

Tengo dos marcos de datos de pandas: dfLeft y dfRight con la fecha como índice.

dfLeft:

cusip factorL date 2012-01-03 XXXX 4.5 2012-01-03 YYYY 6.2 .... 2012-01-04 XXXX 4.7 2012-01-04 YYYY 6.1 .... 

dfRight:

  idc__id factorR date 2012-01-03 XXXX 5.0 2012-01-03 YYYY 6.0 .... 2012-01-04 XXXX 5.1 2012-01-04 YYYY 6.2 

Ambos tienen una forma cercana a (121900,3)

Probé la siguiente combinación:

 test = pd.merge(dfLeft, dfRight, left_index=True, right_index=True, left_on='cusip', right_on='idc__id', how = 'inner') 

Esto le dio a la prueba una forma de (60643500, 6) .

¿Alguna recomendación sobre lo que está mal aquí? Quiero que se fusione en función de date y cusip / idc_id. Nota: para este ejemplo, los cusips están alineados, pero en realidad eso puede no ser así.

Gracias.

Prueba de salida esperada:

  cusip factorL factorR date 2012-01-03 XXXX 4.5 5.0 2012-01-03 YYYY 6.2 6.0 .... 2012-01-04 XXXX 4.7 5.1 2012-01-04 YYYY 6.1 6.2 

Puede agregar 'cuspin' e 'idc_id' como índices a sus DataFrames antes de join (así es como funcionaría en las primeras filas):

 In [10]: dfL Out[10]: cuspin factorL date 2012-01-03 XXXX 4.5 2012-01-03 YYYY 6.2 In [11]: dfL1 = dfLeft.set_index('cuspin', append=True) In [12]: dfR1 = dfRight.set_index('idc_id', append=True) In [13]: dfL1 Out[13]: factorL date cuspin 2012-01-03 XXXX 4.5 YYYY 6.2 In [14]: dfL1.join(dfR1) Out[14]: factorL factorR date cuspin 2012-01-03 XXXX 4.5 5 YYYY 6.2 6 

Restablezca los índices y luego fusione en múltiples teclas (columna-):

 dfLeft.reset_index(inplace=True) dfRight.reset_index(inplace=True) dfMerged = pd.merge(dfLeft, dfRight, left_on=['date', 'cusip'], right_on=['date', 'idc__id'], how='inner') 

A continuación, puede restablecer ‘fecha’ como un índice:

 dfMerged.set_index('date', inplace=True) 

Aquí hay un ejemplo:

 raw1 = ''' 2012-01-03 XXXX 4.5 2012-01-03 YYYY 6.2 2012-01-04 XXXX 4.7 2012-01-04 YYYY 6.1 ''' raw2 = ''' 2012-01-03 XYXX 45. 2012-01-03 YYYY 62. 2012-01-04 XXXX -47. 2012-01-05 YYYY 61. ''' import pandas as pd from StringIO import StringIO df1 = pd.read_table(StringIO(raw1), header=None, delim_whitespace=True, parse_dates=[0], skiprows=1) df2 = pd.read_table(StringIO(raw2), header=None, delim_whitespace=True, parse_dates=[0], skiprows=1) df1.columns = ['date', 'cusip', 'factorL'] df2.columns = ['date', 'idc__id', 'factorL'] print pd.merge(df1, df2, left_on=['date', 'cusip'], right_on=['date', 'idc__id'], how='inner') 

lo que da

  date cusip factorL_x idc__id factorL_y 0 2012-01-03 00:00:00 YYYY 6.2 YYYY 62 1 2012-01-04 00:00:00 XXXX 4.7 XXXX -47