python - groupby - Combinar en un solo nivel de MultiIndex
pandas xs (3)
Me salgo de esto reindexando la fusión de dataframes para tener el multiindex completo para que sea posible una unión a la izquierda.
# 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''])
Haga la unión en el subíndice reindizando el marco de datos newFactor para que contenga el índice del marco de datos izquierdo
df.join(newFactor.reindex(df.index,level=0))
¿Hay alguna manera de fusionarse en un solo nivel de un MultiIndex sin reiniciar el índice?
Tengo una tabla "estática" de valores invariantes en el tiempo, indexados por un ObjectID, y tengo una tabla "dinámica" de campos variables en el tiempo, indexados por ObjectID + Date. Me gustaría unirme a estas tablas.
En este momento, lo mejor que puedo pensar es:
dynamic.reset_index().merge(static, left_on=[''ObjectID''], right_index=True)
Sin embargo, la tabla dinámica es muy grande, y no quiero tener que ensuciar con su índice para combinar los valores.
Sí, desde Pandas 0.14.0, ahora es posible fusionar un DataFrame de índice único con un nivel de un DataFrame multi-indexado usando .join
.
df1.join(df2, how=''inner'') # how=''outer'' keeps all records from both data frames
Los documentos pandas 0.14 describen esto como equivalente, pero más eficiente de la memoria y más rápido que:
merge(df1.reset_index(),
df2.reset_index(),
on=[''index1''],
how=''inner''
).set_index([''index1'',''index2''])
Los documentos también mencionan que .join
no se puede usar para fusionar dos DataFrames multindexados en un solo nivel y desde la discusión del rastreador de GitHub para el número anterior, parece que esto podría no ser prioritario para implementar:
así que me fusioné en la unión única, vea # 6363; junto con algunos documentos sobre cómo hacer una unión multi-multi. Es bastante complicado de implementar realmente. y en mi humilde opinión no vale la pena el esfuerzo, ya que realmente no cambia mucho el uso / velocidad de la memoria.
Sin embargo, hay una conversación de GitHub con respecto a esto, donde ha habido algún desarrollo reciente https://github.com/pydata/pandas/issues/6360 . También es posible lograr esto reiniciando los índices como se mencionó anteriormente y descritos en los documentos también.
Yo usaría el mapeo para una sola columna:
df1[''newcol''] = df1.index.get_level_values(-1).map(lambda x: df2.newcol[x])