Ich habe eine DataFrame
, wo die Spalten ein MultiIndex
sind. Die erste level
spezifiziert 'labels'
, die zweite spezifiziert 'values'
. Eine 'label'
in der (i, j)
Position von df.labels
entspricht der 'value'
in der (i, j)
Position von df.values
.groupby und normalisieren über zwei Arrays
Ich möchte die 'values'
so skalieren, dass sie in jeder durch die entsprechende 'labels'
definierten Gruppe zu eins addiert werden.
import pandas as pd
import numpy as np
np.random.seed([3,1415])
df1 = pd.DataFrame(np.random.choice(('a', 'b', 'c', 'd'),
(10, 5), p=(.4, .3, .2, .1)))
df2 = pd.DataFrame((np.random.rand(10, 5) * 10).round(0))
df = pd.concat([df1, df2], axis=1, keys=['labels', 'values'])
print df
labels values
0 1 2 3 4 0 1 2 3 4
0 b b b b b 5.0 2.0 7.0 7.0 4.0
1 a c c c c 6.0 8.0 1.0 5.0 7.0
2 d c c d c 6.0 3.0 10.0 7.0 4.0
3 a a a b a 5.0 9.0 9.0 5.0 8.0
4 a b a c c 0.0 4.0 1.0 8.0 0.0
5 c b a a b 1.0 6.0 8.0 6.0 1.0
6 c c c a c 9.0 9.0 4.0 1.0 1.0
7 d c a b c 7.0 0.0 3.0 6.0 4.0
8 b a b a a 8.0 6.0 3.0 5.0 4.0
9 c c c b c 2.0 5.0 3.0 1.0 3.0
Ich erwarte, dass die Ergebnisse wie folgt aussehen:
labels values
0 1 2 3 4 0 1 2 3 4
0 b b b b b 0.084746 0.033898 0.118644 0.118644 0.067797
1 a c c c c 0.084507 0.091954 0.011494 0.057471 0.080460
2 d c c d c 0.300000 0.034483 0.114943 0.350000 0.045977
3 a a a b a 0.070423 0.126761 0.126761 0.084746 0.112676
4 a b a c c 0.000000 0.067797 0.014085 0.091954 0.000000
5 c b a a b 0.011494 0.101695 0.112676 0.084507 0.016949
6 c c c a c 0.103448 0.103448 0.045977 0.014085 0.011494
7 d c a b c 0.350000 0.000000 0.042254 0.101695 0.045977
8 b a b a a 0.135593 0.084507 0.050847 0.070423 0.056338
9 c c c b c 0.022989 0.057471 0.034483 0.016949 0.034483
Kann klären, was in Ihrem erwarteten Ergebnis 1 Summieren? – BrenBarn
@BrenBarn alle Werte mit einem entsprechenden Label von 'a' sollte zu 1 summieren. – piRSquared
Ich sehe. Sie haben eine Antwort unten. Im Allgemeinen denke ich, dass Operationen wie diese einfacher gehandhabt werden, wenn Sie Ihre Daten so umformen, dass jede Zeile eine einzige Beobachtung ist. Zum Beispiel würde eine Zeile Spalten für "Label", "Nummer" (Ihre 0-1-2-3-4) und "Wert" enthalten. Es wird dann einfach, auf irgendwelchen von diesen zu gruppieren. – BrenBarn