2016-03-21 25 views
0

Ich versuche, Multiindex-Datenrahmen zu normalisieren: Subtrahieren Sie es ist Mittel und dividieren Sie durch seine Standardabweichung. Das ist, wie Sie tun es mit einem normalen (nicht Multiindex) Datenrahmen:Multiindex-Datenrahmen in Pandas normalisieren

df4 = (df4-df4.mean(1))/df.std(1) 

Doch mit dem Multiindex Datenrahmen funktioniert es nicht: Ich bin diesen absurdish Fehler bekommen:

ValueError: cannot join with no level specified and no overlapping names 

Also ich frage mich, ob es gibt einen Workaround, einfacher als den Index zu flatten und zu entflachen?

Antwort

3

Verwenden Sie die subtract und divide Methoden so können Sie die entsprechende Achse des Betriebs angeben:

df.subtract(mean, axis=0).divide(std, axis=0) 

Zum Beispiel

import numpy as np 
import pandas as pd 
np.random.seed(2016) 

arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'], 
      ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']] 

df = pd.DataFrame(np.random.randint(10, size=(8,3)), index=arrays) 
mean = df.mean(axis=1) 
std = df.std(axis=1) 
print(df.subtract(mean, axis=0).divide(std, axis=0)) 

ergibt

   0   1   2 
bar one -0.377964 1.133893 -0.755929 
    two -0.755929 1.133893 -0.377964 
baz one 0.000000 -1.000000 1.000000 
    two -0.800641 1.120897 -0.320256 
foo one -0.164957 -0.907265 1.072222 
    two -1.154701 0.577350 0.577350 
qux one -0.577350 1.154701 -0.577350 
    two -0.377964 1.133893 -0.755929