2016-06-20 5 views
1

Привет У меня есть два кадра данных. У них есть общий индекс. Я хотел бы преобразовать два исходных фрейма даты в два новых, которые содержат только общий индекс. Не могли бы вы помочь мне в этом? Вот пример.фильтровать два кадра данных в соответствии с их общим индексом

 df1 = pd.DataFrame({'one' : pd.Series([1,3,5], index=['a', 'b', 'c']), 
    ....:     'two' : pd.Series([2,4,6], index=['a', 'b', 'c']), 
    ....:     'three' : pd.Series([-4,-3,-2], index=['a','b', 'c'])}); 
df2=pd.DataFrame({'x' : pd.Series([1,3,5], index=['b', 'c', 'd']), 
    ....:     'y' : pd.Series([2,4,6], index=['b', 'c', 'd']), 
    ....:     'z' : pd.Series([-3,-2,-1], index=['b', 'c', 'd'])}); 
print(df1) 
print(df2) 

Итак, вы можете видеть, что df1 и df2 следующие.

one three two 
a 1  -4 2 
b 3  -3 4 
c 5  -2 6 
    x y z 
b 1 2 -3 
c 3 4 -2 
d 5 6 -1 

Я хотел бы видеть, что они становятся как

one three two 

b 3  -3 4 
c 5  -2 6 
    x y z 
b 1 2 -3 
c 3 4 -2 

ответ

0

я хотел бы использовать Index.intersection в сочетании с boolean indexing:

In [73]: mask = df1.index.intersection(df2.index) 

In [77]: df1 = df1.ix[mask] 

In [78]: df2 = df2.ix[mask] 

In [79]: df1 
Out[79]: 
    one three two 
b 3  -3 4 
c 5  -2 6 

In [80]: df2 
Out[80]: 
    x y z 
b 1 2 -3 
c 3 4 -2 

в качестве альтернативы вы можете использовать isin() fution:

In [81]: df1[df1.index.isin(df2.index)] 
Out[81]: 
    one three two 
b 3  -3 4 
c 5  -2 6 

In [82]: df2[df2.index.isin(df1.index)] 
Out[82]: 
    x y z 
b 1 2 -3 
c 3 4 -2 
0

Вы можете использовать .join():

df1.join(df2, how='inner')[df1.columns] 

    one three two 
b 3  -3 4 
c 5  -2 6