2016-06-23 8 views
1

Ich möchte meinen Pandas-Datenrahmen mit hierarchisch indizierten Spalten nehmen und die Werte so normalisieren, dass die Werte mit dem gleichen äußeren Index eins ergeben. Zum Beispiel:GroupBy Transformation auf hierarchisch indiziertem Datenframe

cols = pd.MultiIndex.from_tuples([('A', 1), ('A', 2), ('B', 1), ('B', 2)]) 
X = pd.DataFrame(np.arange(20).reshape(5,4), columns=cols) 

gibt einen Datenframe X:

A  B 
    1 2 1 2 
0 0 1 2 3 
1 4 5 6 7 
2 8 9 10 11 
3 12 13 14 15 
4 16 17 18 19 

würde Ich mag die Zeilen normalisieren, so dass die A-Säulen 1 und die auf 1 summieren B Spalten summieren D.h. zu generieren:

for-Schleife folgende
A      B 
    1   2   1   2 
0 0.000000 1.000000 0.400000 0.600000 
1 0.444444 0.555556 0.461538 0.538462 
2 0.470588 0.529412 0.476190 0.523810 
3 0.480000 0.520000 0.482759 0.517241 
4 0.484848 0.515152 0.486486 0.513514 

Das funktioniert:

res = [] 
for (k,g) in X.groupby(axis=1, level=0): 
    g = g.div(g.sum(axis=1), axis=0) 
    res.append(g) 
res = pd.concat(res, axis=1) 

Aber das Motto nicht:

X.groupby(axis=1, level=0).transform(lambda x: x.div(x.sum(axis=1), axis=0)) 

mit der Fehlermeldung:

Valueerror: Transformations müssen zurückkehren ein Skalarwert für jede Gruppe

Irgendeine Idee, was das Problem sein könnte?

Antwort

1

ist das was du willst?

In [33]: X.groupby(level=0, axis=1).apply(lambda x: x.div(x.sum(axis=1), axis=0)) 
Out[33]: 
      A     B 
      1   2   1   2 
0 0.000000 1.000000 0.400000 0.600000 
1 0.444444 0.555556 0.461538 0.538462 
2 0.470588 0.529412 0.476190 0.523810 
3 0.480000 0.520000 0.482759 0.517241 
4 0.484848 0.515152 0.486486 0.513514 
+0

Ja, das tut es. Vielen Dank! Ich verstehe nicht ganz, warum Transformation nicht funktioniert, aber die Anwendung scheint sowieso generischer zu sein. – dylkot

Verwandte Themen