2017-07-05 5 views
0

Ich habe folgende Datenrahmen:Wie manipuliere ich element- und gruppenweise gleichzeitig im Multiindex-Frame?

df=pd.DataFrame(np.random.randint(1,3,27).reshape((9,3)),\ 
      index= [['KH','KH','KH','KH','KH','KH','KH','KH','KH'],\ 
       ['AOK','AOK','AOK','DOK','DOK','DOK','ROK','ROK','ROK'],\ 
       ['A','B','C','A','B','C','A','B','C']],\ 
      columns=['JE','TE','DE']\ 
      ) 
    df.index.names = ['Deck','Status','Urs'] 
    df 
Out[116]: 
       JE TE DE 
Deck Status Urs    
KH AOK A  1 1 2 
      B  1 2 2 
      C  2 1 1 
    DOK A  2 2 1 
      B  1 2 1 
      C  1 2 2 
    ROK A  2 2 2 
      B  1 1 2 
      C  1 2 1 

Jetzt möchte ich einfach eine Spalte 'JErel' ihm anhängen. Diese Spalte sollte die Werte von 'JE' enthalten, aber als relativen Bruchteil. Der Bruch sollte sich auf die Gesamtsumme der 'Status' Indexgruppen beziehen.

kann ich die Summe über Zugang:

1/df.loc[('KH','AOK')]['JE'].sum(), 
1/df.loc[('KH','AOK')]['JE'].sum(), 
2/df.loc[('KH','AOK')]['JE'].sum() and then, 
2/df.loc[('KH','DOK')]['JE'].sum(), ... 

,,,, Das ist, wie weit ich habe:

df.loc[('KH','AOK')]['JE'].sum() 
Out[117]: 4 

Die Säule in so etwas wie führen sollte. Wie kann ich die Spalte dynamisch mit apply(Lambda...) oder so hinzufügen?

Antwort

3

können Sie groupby.transform verwenden, um die Spalte JE Summe zu berechnen, das die gleiche Länge und Index wie der ursprünglichen Datenrahmen hat, und dann teilen JE Säule durch:

df['JErel'] = df.JE.div(df.groupby(level=['Deck','Status']).JE.transform('sum')) 
df 
#     JE TE DE  JErel 
# Deck Status Urs    
# KH  AOK A 2 2 1 0.400000 
#    B 2 2 1 0.400000 
#    C 1 1 2 0.200000 
#   DOK A 1 1 2 0.250000 
#    B 2 1 2 0.500000 
#    C 1 1 1 0.250000 
#   ROK A 2 1 2 0.333333 
#    B 2 1 2 0.333333 
#    C 2 1 1 0.333333 
+0

Sehr schöne Lösung. Vielen Dank. – JohnnyS

Verwandte Themen