Ausgabe
Ich habe eine Frage zu einer Transformation, die ich einem Dataframe-Panda hinzufügen möchte. Ich habe einen Datenrahmen df mit den folgenden Spalten:
df.columns = Index(['S', 'HZ', 'Z', 'Demand'], dtype='object')
Ich möchte folgende Transformation durchführen:
for s in range(S):
for t in range(HZ):
for z in range(Z):
df.loc[(df['S'] == s) & (df['HZ'] == t) & (df['Z'] == z), 'Demand'] = D[s][t][z]
Wobei D ein numpy Array mit den entsprechenden Dimensionen ist. Hier ist ein einfaches Beispiel dafür, was ich versuche (mit T = 0, um es einfacher zu machen).
Hier ist df vorher:
S HZ Z Demand
0 0 0 0 0
1 0 0 1 0
2 0 1 0 0
3 0 1 1 0
4 0 2 0 0
5 0 2 1 0
6 1 0 0 0
7 1 0 1 0
8 1 1 0 0
9 1 1 1 0
10 1 2 0 0
11 1 2 1 0
Hier ist D:
D = [[[1, 2],
[3, 4],
[5, 6]],
[[7, 8],
[9, 10],
[11, 12]]]
Und hier ist, was ich will:
S HZ Z Demand
0 0 0 0 1
1 0 0 1 2
2 0 1 0 3
3 0 1 1 4
4 0 2 0 5
5 0 2 1 6
6 1 0 0 7
7 1 0 1 8
8 1 1 0 9
9 1 1 1 10
10 1 2 0 11
11 1 2 1 12
Dieser Code funktioniert, ist aber sehr lang, also habe ich etwas anderes versucht, um die for-Schleifen zu vermeiden:
df.loc[df['HZ'] >= T, 'Demand'] = D[df['S']][df['HZ']][df['Z']]
Was den folgenden Fehler auslöst:
ValueError: Must have equal len keys and value when setting with an iterable
Ich suche, was dieser Fehler bedeutet, wie man ihn wenn möglich behebt, und wenn nicht möglich, gibt es eine Möglichkeit, das zu tun, was ich will, ohne for-Schleifen zu verwenden?
Danke im Voraus
Lösung
Nachdem ich viele Dinge ausprobiert habe, habe ich endlich etwas gefunden, das funktioniert:
df.loc[df['HZ'] >= T, 'Demand'] = D[df.loc[df['HZ'] >= T, 'S']][df.loc[df['HZ'] >= T, 'HZ'] - T][df.loc[df['HZ'] >= T, 'Z']]
Beantwortet von – Haeden
Antwort geprüft von – Candace Johnson (FixError Volunteer)