2013-05-20 17 views
22

Czy istnieje sposób na scalenie na pojedynczym poziomie MultiIndex bez resetowania indeksu?Scalanie na pojedynczym poziomie MultiIndex

Mam "statyczną" tabelę wartości niezależnych od czasu, indeksowanych przez ObjectID, i mam "dynamiczną" tabelę zmiennych czasowych, indeksowanych przez ObjectID + Date. Chciałbym dołączyć do tych tabel razem.

Teraz najlepsze, co mogę myśleć to:

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

Jednak dynamiczny stół jest bardzo duży, a ja nie chcę mieć do syf wokół z indeksu, aby połączyć wartości.

+0

Co jeśli utworzono dodatkową kolumnę z poziomu MultiIndex chcesz dołączyć, a następnie połączyła się na/dołączył on, że na ten temat? Może nie być całkowicie sprawny, ale przynajmniej utrzymujesz indeks. –

+0

Tak, to by działało. Kosztowałoby to trochę pamięci i nie pomogłoby to w przyspieszeniu. W tym momencie jednak myślę, że równie dobrze mogę zrzucić indeks, jeśli nie pomoże to w szybszym scalaniu. –

+2

Odpowiedni problem z Githubem https://github.com/pydata/pandas/issues/3662 –

Odpowiedz

9

Tak, bo pandy 0.14.0, jest obecnie możliwe, aby scalić pojedynczo -indeksowane DataFrame o poziomie wielowierszowej DataFrame z wykorzystaniem .join.

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

The 0.14 pandas docs opisuje to równoważne ale pamięć skuteczny i szybszy niż:

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

Docs również wspomnieć, że .join nie może być stosowany do łączenia dwóch multiindexed DataFrames na jednym poziomie, z GitHub dyskusja trackera dla poprzedniego wydania, wydaje się, że to może nie być priorytetowe w implementacji:

, więc połączyłem się w pojedynczym połączeniu, zobacz # 6363 ; wraz z niektórymi dokumentami na temat jak wykonać sprzężenie multi-multi. To dość skomplikowane narzędzie. i IMHO nie warte wysiłku, ponieważ tak naprawdę wcale nie zmienia to zużycia pamięci/prędkości.

Jednak nie jest to rozmowa GitHub dotyczące tego, gdzie doszło kilka ostatnich rozwój https://github.com/pydata/pandas/issues/6360. Można to również osiągnąć poprzez zresetowanie wskaźników, jak wspomniano wcześniej i opisanych również w dokumentach.

+1

Dla pierwszego przykładu, w jaki sposób wybierasz poziom MultiIndex, który ma być używany do łączenia? –

+1

nvm, [docs] (http://pandas.pydata.org/pandas-docs/stable/merging.html#joining-a-single-index-to-a-multi-index) mówią, że dołącza się w oparciu o poziom indeksu o tej samej nazwie co indeks jednopoziomowy. –

+0

Połączenia są bardzo szybkie w pandach –

2

Obejmuję to poprzez ponowne indeksowanie łączącej się ramek danych w celu uzyskania pełnego multiindeksu, tak aby możliwe było lewe połączenie.

# 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']) 

Czy łączenia na subindeksu przez reindeksowania się dataframe newFactor zawierać indeks lewej ramce danych

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

użyłbym mapowania dla pojedynczej kolumny:

df1['newcol'] = df1.index.get_level_values(-1).map(lambda x: df2.newcol[x]) 
Powiązane problemy