2014-02-04 3 views
0

Я один dataframe, давайте назовем его df1, с аа мультииндексного (только фрагментом, есть много больше столбцов и строк)Панды выравнивать мультииндексное dataframe с другими с регулярным индексом

           M1_01 M1_02 M1_03 M1_04 M1_05 
Eventloc     Exonloc            
chr10:52619746-52623793|- 52622648-52622741  0  0  0  0  0 
chr19:58859211-58865080|+ 58864686-58864827  0  0  0  0  0 
          58864686-58864840  0  0  0  0  0 
          58864744-58864840  0  0  0  0  0 
chr19:58863054-58863649|- 58863463-58863550  0  0  0  0  0 

И еще dataframe, давайте перейдите с именем объявления df2, вот так (это результаты разных алгоритмов, поэтому у них разные индексы). Столбцы одинаковы, хотя в первом случае они не сортируются.

                    M1_01 M1_02 M1_03 M1_04 M1_05 
chr3:53274267:53274364:[email protected]:53271813:53271836:[email protected]:53268999:53269190:-   0.02 NaN NaN NaN NaN 
chr2:9002720:9002852:[email protected]:9002401:9002452:[email protected]:9000743:9000894:-    0.04 NaN NaN NaN NaN 
chr1:160192441:160192571:[email protected]:160190249:160190481:[email protected]:160188639:160188758:- NaN NaN NaN NaN NaN 
chr7:100473194:100473333:[email protected]:100478317:100478390:[email protected]:100478906:100479034:+ NaN NaN NaN NaN NaN 
chr11:57182088:57182204:[email protected]:57177408:57177594:[email protected]:57176648:57176771:-  NaN NaN NaN NaN NaN 

И у меня есть этот dataframe, снова давайте быть творческим и назвать его df3, который объединяет показатели df1 и df2:

                        Eventloc    Exonloc 
event_id                               
chr3:53274267:53274364:[email protected]:53271813:53271836:[email protected]:53268999:53269190:-   chr3:53269191-53274267|- 53271812-53271836 
chr2:9002720:9002852:[email protected]:9002401:9002452:[email protected]:9000743:9000894:-     chr2:9000895-9002720|-  9002400-9002452 
chr1:160192441:160192571:[email protected]:160190249:160190481:[email protected]:160188639:160188758:- chr1:160188759-160192441|- 160190248-160190481 
chr7:100473194:100473333:[email protected]:100478317:100478390:[email protected]:100478906:100479034:+ chr7:100473334-100478906|+ 100478316-100478390 
chr4:55124924:55124984:[email protected]:55127262:55127579:[email protected]:55129834:55130094:+   chr4:55124985-55129834|+ 55127261-55127579 

мне нужно сделать 1: сравнение 1 из этих результатов , так что я пытался делать как

df1.ix[df3.head().values] 

и

df1.ix[pd.MultiIndex.from_tuples(df3.head().values.tolist(), names=['Eventloc', 'Exonloc'])] 

Но они оба дают мне данные кадра НС. Единственное, что работает это:

event_id = df2.index[0] 
df1.ix[df3.ix[event_id]] 

Но это, очевидно, неоптимальное, как это не векторные и очень медленно. Я думаю, что мне не хватает критической концепции MultiIndexes.

Спасибо, Ольга

+1

Не могли бы вы попробовать 'df1.ix [pd.Index (df3.head(). values)]'? Я думаю, это может сработать для вас. – TomAugspurger

+0

Как-то это все еще не работает, хотя я дважды и трижды проверил идентификаторы. –

+0

Собственно, да, это сработало! Вся моя проблема заключалась в том, что я создал 'df1', сбросив индекс другого фрейма данных, и я взял только' head() ', и поэтому я не получал никакого перекрытия. –

ответ

2

Если я понимаю, что вы делаете, вы должны либо в явной форме построения кортежей (они должны быть полностью qualifiied кортежи, хотя, например, имеет значение для каждого уровня), или проще, построить булево индексатор)

In [7]: df1 = DataFrame(0,index=MultiIndex.from_product([list('abc'),[range(2)]]),columns=['A']) 

In [8]: df1 
Out[8]: 
    A 
a 0 0 
b 1 0 
c 0 0 

[3 rows x 1 columns] 

In [9]: df1 = DataFrame(0,index=MultiIndex.from_product([list('abc'),list(range(2))]),columns=['A']) 

In [10]: df1 
Out[10]: 
    A 
a 0 0 
    1 0 
b 0 0 
    1 0 
c 0 0 
    1 0 

[6 rows x 1 columns] 

In [11]: df3 = DataFrame(0,index=['a','b'],columns=['A']) 

In [12]: df3 
Out[12]: 
    A 
a 0 
b 0 

[2 rows x 1 columns] 

все эти значения уровня 0 в первом кадре

In [13]: df1.index.get_level_values(level=0) 
Out[13]: Index([u'a', u'a', u'b', u'b', u'c', u'c'], dtype='object') 

Построить boolea n indexer

In [14]: df1.index.get_level_values(level=0).isin(df3.index) 
Out[14]: array([ True, True, True, True, False, False], dtype=bool) 

In [15]: df1.loc[df1.index.get_level_values(level=0).isin(df3.index)] 
Out[15]: 
    A 
a 0 0 
    1 0 
b 0 0 
    1 0 

[4 rows x 1 columns] 
Смежные вопросы