Mapa de índice de dataframe utilizando diccionario

¿Por qué df.index.map(dict) funciona como df['column_name'].map(dict) ?

Aquí hay un pequeño ejemplo de cómo tratar de usar index.map:

 import pandas as pd df = pd.DataFrame({'one': {'A': 10, 'B': 20, 'C': 30, 'D': 40, 'E': 50}}) map_dict = {'A': 'every', 'B': 'good', 'C': 'boy', 'D': 'does', 'E': 'fine'} df ''' one A 10 B 20 C 30 D 40 E 50 ''' df['two'] = df.index.map(mapper=map_dict) 

Esto genera TypeError: 'dict' object is not callable

Alimentándolo una lambda funciona:

 df['two'] = df.index.map(mapper=(lambda x: map_dict[x])); df ''' one two A 10 every B 20 good C 30 boy D 40 does E 50 fine ''' 

Sin embargo, restablecer el índice y la asignación en una columna funciona como se esperaba sin queja:

 df.reset_index(inplace=True) df.rename(columns={'index': 'old_ndx'}, inplace=True) #so there's no index name confusion df['two'] = df.old_ndx.map(map_dict); df ''' old_ndx one two 0 A 10 every 1 B 20 good 2 C 30 boy 3 D 40 does 4 E 50 fine ''' 

No estoy respondiendo tu pregunta … Solo te estoy dando una mejor solución.
Usa to_series() ellos map

 df = pd.DataFrame({'one': {'A': 10, 'B': 20, 'C': 30, 'D': 40, 'E': 50}}) map_dict = {'A': 'every', 'B': 'good', 'C': 'boy', 'D': 'does', 'E': 'fine'} df['two'] = df.index.to_series().map(map_dict) df one two A 10 every B 20 good C 30 boy D 40 does E 50 fine 

Añadiendo get al final.

 df['Two']=df.index.map(map_dict.get) df Out[155]: one Two A 10 every B 20 good C 30 boy D 40 does E 50 fine 

Una solución alternativa al mapa de llamadas:

 df['two'] = pd.Series(map_dict) df one two A 10 every B 20 good C 30 boy D 40 does E 50 fine 

En cualquier caso, hasta que el problema del mapeo se resuelva (según el comentario de juanpa.arrivillaga), debe convertir el índice o el dict-to-map en una serie de pandas.

A partir de la versión 0.23.x de pandas (publicada el 15 de mayo de 2018), este problema se solucionó:

 import pandas as pd pd.__version__ # 0.23.4 df = pd.DataFrame({'one': {'A': 10, 'B': 20, 'C': 30, 'D': 40, 'E': 50}}) map_dict = {'A': 'every', 'B': 'good', 'C': 'boy', 'D': 'does', 'E': 'fine'} df # one # A 10 # B 20 # C 30 # D 40 # E 50 df.index.map(map_dict) # one # every 10 # good 20 # boy 30 # does 40 # fine 50 

Desde la página de Novedades para pandas 0.23.0 dice:

Index.map () ahora puede aceptar objetos de entrada de Series y diccionarios (GH12756, GH18482, GH18509).

Para más información, consulte la página de ayuda de Index.map.

map (una palabra clave de python) aparentemente se usa como un método de df.index

Debido a que esto tiene sus propias demandas internas, no se permite pasarle un argumento que no __call__ método __call__ .

lambda y las funciones son invocables, una simple prueba:

 def foo(): pass if foo.__call__: print True # Prints True bar = lambda x: x+1 if bar.__call__: print True # Prints True print {'1':'one'}.__call__ # AttributeError: 'dict' object has no attribute '__call__' 

Una alternativa más corta: sin una llamada explícita a to_series o pd.Series :

 df['two'] = df.rename(map_dict).index