[FIXED] Pandas ValueError : Muss gleiche Len-Schlüssel und Werte haben, wenn es mit einem Iterable gesetzt wird

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)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like