Map dataframe index using dictionary

后端 未结 6 1859
Happy的楠姐
Happy的楠姐 2020-12-08 20:29

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:



        
相关标签:
6条回答
  • 2020-12-08 20:46

    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.

    0 讨论(0)
  • 2020-12-08 20:52

    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__'
    
    0 讨论(0)
  • 2020-12-08 20:54

    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
    
    0 讨论(0)
  • 2020-12-08 20:55

    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

    0 讨论(0)
  • 2020-12-08 20:57

    A shorter alternative --with no explicit call to to_series or pd.Series:

    df['two'] = df.rename(map_dict).index
    
    0 讨论(0)
  • 2020-12-08 20:59

    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
    
    0 讨论(0)
提交回复
热议问题