Why doesn\'t df.index.map(dict)
work like df[\'column_name\'].map(dict)
?
Here\'s a little example of trying to use index.map:
An alternative workaround to calling map:
df['two'] = pd.Series(map_dict)
df
one two
A 10 every
B 20 good
C 30 boy
D 40 does
E 50 fine
In any case, until the mapping issue gets resolved (per juanpa.arrivillaga's comment) you have to convert either the index or the dict-to-map to a pandas Series.
map
(a python keyword) is apparently being used as a method of df.index
Because this has its own internal demands, passing it an argument which has no __call__
method is not allowed.
lambda
and functions are callable, a simple test:
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__'
I'm not answering your question... Just giving you a better work around.
Use to_series()
them 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
As of pandas version 0.23.x (released at May 15th, 2018) this problem is fixed:
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
From the What's New page for pandas 0.23.0 it says:
Index.map() can now accept Series and dictionary input objects (GH12756, GH18482, GH18509).
For more information, check the help page of Index.map
A shorter alternative --with no explicit call to to_series
or pd.Series
:
df['two'] = df.rename(map_dict).index
Adding get
at the end
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