2013-05-20 5 views
22

Есть ли способ слияния на одном уровне MultiIndex без сброса индекса?Слияние на одном уровне MultiIndex

У меня есть «статическая» таблица значений времени, индексированных ObjectID, и у меня есть «динамическая» таблица изменяющихся во времени полей, индексированных ObjectID + Date. Я хотел бы присоединиться к этим таблицам вместе.

Прямо сейчас, лучшее, что я могу думать:

dynamic.reset_index().merge(static, left_on=['ObjectID'], right_index=True) 

Однако динамическая таблица очень большая, и я не хочу, чтобы слоняться вокруг с индексом для того, чтобы объединить значения.

+0

Что делать, если вы создали дополнительный столбец с уровнем мультииндексных вы хотите присоединиться, и затем объединить/вступил в том, что по этому поводу? Не может быть абсолютно эффективным, но, по крайней мере, вы поддерживаете индекс. –

+0

Да, это сработает. Это стоило бы некоторой памяти, и это не ускорило бы скорость. В этот момент, однако, я думаю, что я мог бы также полностью отказаться от индекса, если он не поможет ускорить слияния. –

+2

Соответствующий github issue https://github.com/pydata/pandas/issues/3662 –

ответ

9

Да, так как панды 0.14.0, теперь можно слить по отдельности -индексированный DataFrame с уровнем мультииндексированного DataFrame с использованием .join.

df1.join(df2, how='inner') # how='outer' keeps all records from both data frames 

The 0.14 pandas docs описывает это как эквивалент, но больше памяти эффективнее и быстрее, чем:

merge(df1.reset_index(), 
     df2.reset_index(), 
     on=['index1'], 
     how='inner' 
    ).set_index(['index1','index2']) 

Документах также отметить, что .join не может быть использована для объединения двух мультииндексированных DataFrames на одном уровне, так и от GitHub трекер для предыдущего выпуска, похоже, что это может быть не приоритетным для реализации:

поэтому я слился в одно соединение, см. # 6363 ; наряду с некоторыми документами на , как сделать мульти-мульти-соединение. Это довольно сложно реализовать на самом деле . и IMHO не стоит усилий, поскольку он действительно не меняет использование/скорость использования памяти.

Тем не менее, есть беседа GitHub об этом, где была некоторая недавняя разработка https://github.com/pydata/pandas/issues/6360. Это также можно достичь, сбросив индексы, как упоминалось ранее, и описано в документах.

+1

Для вашего первого примера, как вы выбираете уровень MultiIndex для использования для соединения? –

+1

nvm, [docs] (http://pandas.pydata.org/pandas-docs/stable/merging.html#joining-a-single-index-to-a-multi-index) говорят, что он объединяется на основе уровень индекса с тем же именем, что и одноуровневый индекс. –

+0

И присоединяется очень быстро в pandas –

2

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

# Create the left data frame 
import pandas as pd 
idx = pd.MultiIndex(levels=[['a','b'],['c','d']],labels=[[0,0,1,1],[0,1,0,1]], names=['lvl1','lvl2']) 
df = pd.DataFrame([1,2,3,4],index=idx,columns=['data']) 

#Create the factor to join to the data 'left data frame' 
newFactor = pd.DataFrame(['fact:'+str(x) for x in df.index.levels[0]], index=df.index.levels[0], columns=['newFactor']) 

ли объединение на субиндексе по переиндексации в dataframe newFactor содержать индекс левого фрейма данных

df.join(newFactor.reindex(df.index,level=0)) 
1

Я хотел бы использовать отображение для одного столбца:

df1['newcol'] = df1.index.get_level_values(-1).map(lambda x: df2.newcol[x]) 
Смежные вопросы