2017-12-22 5 views
3

Ich versuche, eine Spalte in einen Datenrahmen aufzunehmen. Ich benutze Werkzeug, um es hinzuzufügen, weil es auf eine Variable verweisen sollte.Einschließlich Spalten mit MAP und Dictionary in einem Datenrahmen

Hier ist die aktuelle Datenrahmen:

X  Y   Z 
    xx high   10 
     slow   20 
     fat   30 
    xy high   15 
     slow   10 
     fast   30 

Ich mag wäre ein column D unter X als Hinweis enthalten. Diese neue Spalte soll mit den folgenden Werten auf einen dict (Wörterbuch) basieren:

{'xx': -4.50, 'xy': -10.21} 

Also habe ich:

df['D'] = df['X'].map(dicc) 

Allerdings, wenn ich den Code eine Nachricht ausgeführt wird KeyError: 'X'. Fehle ich etwas im Code oder ist es ein Problem im Datentyp (str/float)?

Jede Hilfe wäre willkommen. Vielen Dank!

EDIT: Ich erhalte den Datenrahmen von einem groupbyX und Y als Referenz (danke für den Kommentar) nehmen.

+0

'X' scheint ein Index zu sein, nicht eine Spalte. –

Antwort

2

können Sie eine einfache Liste Verständnis verwenden es

df = pd.DataFrame({'X':['xx', 'xx', 'xx', 'xy', 'xy', 'xy'], 
        'Y':['high', 'slow', 'fat']*2, 
        'Z':[10, 20, 30, 15, 10, 30]}) 

dicc = {'xx': -4.5, 'xy':-10.21} 

df['D'] = [dicc[i] for i in df['X']] 

e extra zu tun: Wenn Ihr df kommt von einem grouby und der Code sagt ein Fehler, weil es nicht Spalte ‚X‘ finden kann, ist es weil 'X' jetzt eine Indexspalte ist. Um das zu beheben, sagen Sie einfach df = df.reset_index(), damit Ihr DF wie in dieser Antwort aussieht.

1

Sie können map verwenden, aber zuerst ist notwendig, convert Niveau MultiIndexto_series:

dicc = {'xx': -4.50, 'xy': -10.21} 

L = [df.index.get_level_values('X').to_series().map(dicc), 
    df.index.get_level_values('Y')] 

df.index = pd.MultiIndex.from_arrays(L, names = df.index.names) 
#alternative solution 
#df = df.set_index(pd.MultiIndex.from_arrays(L, names = df.index.names)) 


print (df) 
       Z 
X  Y  
-4.50 high 10 
     slow 20 
     fat 30 
-10.21 high 15 
     slow 10 
     fast 30 
Verwandte Themen