¿Cómo obtener el índice común de dos marcos de datos pandas?

Tengo dos pandas DataFrames df1 y df2 y quiero transformarlos para que mantengan valores solo para el índice que son comunes a los 2 marcos de datos.

df1

values 1 0 28/11/2000 -0.055276 29/11/2000 0.027427 30/11/2000 0.066009 01/12/2000 0.012749 04/12/2000 0.113892 

df2

  values 2 24/11/2000 -0.004808 27/11/2000 -0.001812 28/11/2000 -0.026316 29/11/2000 0.015222 30/11/2000 -0.024480 

volverse

df1

  value 1 28/11/2000 -0.055276 29/11/2000 0.027427 30/11/2000 0.066009 

df2

  value 2 28/11/2000 -0.026316 29/11/2000 0.015222 30/11/2000 -0.024480 

Puedes usar Index.intersection + DataFrame.loc :

 idx = df1.index.intersection(df2.index) print (idx) Index(['28/11/2000', '29/11/2000', '30/11/2000'], dtype='object') 

Solución alternativa con numpy.intersect1d :

 idx = np.intersect1d(df1.index, df2.index) print (idx) ['28/11/2000' '29/11/2000' '30/11/2000'] 

 df1 = df1.loc[idx] print (df1) values 1 28/11/2000 -0.055276 29/11/2000 0.027427 30/11/2000 0.066009 df2 = df1.loc[idx] print (df2) values 1 28/11/2000 -0.055276 29/11/2000 0.027427 30/11/2000 0.066009 
 In [352]: common = df1.index.intersection(df2.index) In [353]: df1.loc[common] Out[353]: values1 0 28/11/2000 -0.055276 29/11/2000 0.027427 30/11/2000 0.066009 In [354]: df2.loc[common] Out[354]: values2 0 28/11/2000 -0.026316 29/11/2000 0.015222 30/11/2000 -0.024480 

Y, usando isin . intersection embargo, la intersection podría ser más rápida.

 In [286]: df1.loc[df1.index.isin(df2.index)] Out[286]: values1 0 28/11/2000 -0.055276 29/11/2000 0.027427 30/11/2000 0.066009 In [287]: df2.loc[df2.index.isin(df1.index)] Out[287]: values2 0 28/11/2000 -0.026316 29/11/2000 0.015222 30/11/2000 -0.024480 

dropna + dropna

 df1.reindex(df2.index).dropna() Out[21]: values1 28/11/2000 -0.055276 29/11/2000 0.027427 30/11/2000 0.066009 df2.reindex(df1.index).dropna() Out[22]: values2 28/11/2000 -0.026316 29/11/2000 0.015222 30/11/2000 -0.024480 

¿Has probado algo como

 df1 = df1.loc[[x for x in df1.index if x in df2.index]] df2 = df2.loc[[x for x in df2.index if x in df1.index]] 

El objeto de índice tiene algunas propiedades de conjunto, por lo que simplemente puede tomar la intersección de la siguiente manera:

 df1 = df1.reindex[ df1.index & df2.index ] 

Esto mantiene el orden de la primera ttwig de datos en la intersección, df .

Puede pd.merge con un DataFrame intermediario creado con los índices del otro DataFrame:

 df2_indexes = pd.DataFrame(index=df2.index) df1 = pd.merge(df1, df2_indexes, left_index=True, right_index=True) df1_indexes = pd.DataFrame(index=df1.index) df2 = pd.merge(df2, df1_indexes, left_index=True, right_index=True) 

o puedes usar pd.eval :

 df2_indexes = df2.index.values df1 = df1[eval("df1.index in df2_indexes"] df1_indexes = df1.index.values df2 = df2[eval("df2.index in df1_indexes"]