[FIXED] So verwenden Sie Switch-Case für Pandas-Datenrahmen mit einer Spalte, die Sätze als Wert enthält

Ausgabe

Ich habe einen Pandas-Datenrahmen (Variablenname box_status ), in dem eine Spalte SETWerte enthält:

+-----------------------+-------------------------+
|             zone_name |                   status|
+-----------------------+-------------------------+
|          D7_BATCH_BOX |            {NOT_STARTED}|
|    BUS_BATCH_AMER_BOX | {NOT_STARTED, COMPLETED}|
|    BUS_BATCH_AUST_BOX | {NOT_STARTED, COMPLETED}|
|    DOM_BATCH_AMER_BOX |  {NOT_LOADED, COMPLETED}|
|    DOM_BATCH_AUST_BOX |  {NOT_LOADED, COMPLETED}|
|    DOM_BATCH_CAND_BOX |  {NOT_LOADED, COMPLETED}|
|         SIT_BATCH_BOX |            {NOT_STARTED}|
|        SHORT_FEES_BOX |              {COMPLETED}|
+-----------------------+-------------------------+

Ich muss eine weitere Spalte hinzufügen, indem ich die Switch-Case-Bedingung basierend auf dem Spaltenstatus verwende , z . B. wenn die Statusspalte die Werte “NOT_STARTED” und ” COMPLETED ” enthält, dann enthält die neue Spalte “RUNNING”.

Ich habe den folgenden Code verwendet, in dem ich Sätze für jede Bedingung erstellt habe, und versucht, ihn mit einem
issubset()Fehler zu verwenden:

Traceback (most recent call last):
  File "status_mailer_new.py", line 211, in <module>
    box_status["zone_status"] = np.where(comp_set.issubset(box_status["status"]), "COMPLETED",
TypeError: unhashable type: 'set'

Code ist:

comp_set = {"COMPLETED"}
runn_set = {"COMPLETED","NOT_STARTED"}
yet_to_start_set = {"NOT_STARTED"}
fail_set1 = {"NOT_STARTED","NOT_LOADED"}
fail_set2 = {"NOT_LOADED","COMPLETED"}
fail_set3 = {"NOT_LOADED"}
box_status["zone_status"] = np.where(comp_set.issubset(box_status["status"]), "COMPLETED",
                           np.where(runn_set.issubset(box_status["status"]), "RUNNING",
                           np.where(yet_to_start_set.issubset(box_status["status"]), "YET TO START",
                           np.where(fail_set1.issubset(box_status["status"]),"ERROR",
                           np.where(fail_set2.issubset(box_status["status"]),"ERROR",
                           np.where(fail_set3.issubset(box_status["status"]),"ERROR","ERROR"))))))

Lösung

Ich glaube, Sie möchten herausfinden, wo eine bestimmte Menge gleich den Mengen in statusist, anstatt ihre Teilmenge zu sein. Sie können einen weiteren Datenrahmen mit entsprechenden Bedingungen erstellen und ihn mit dem Hauptdatenrahmen zusammenführen. Sie müssen die Sätze jedoch in Zeichenfolgen umwandeln, um Folgendes ausführen zu können merge:

status_dict =  {
'comp_set' : {"COMPLETED"},
'runn_set' : {"COMPLETED","NOT_STARTED"},
'yet_to_start_set' : {"NOT_STARTED"},
'fail_set1' : {"NOT_STARTED","NOT_LOADED"},
'fail_set2' : {"NOT_LOADED","COMPLETED"},
'fail_set3' : {"NOT_LOADED"}}

df2 = pd.DataFrame.from_dict(status_dict.items())
df2.columns = ['new_col', 'status']

# change dtypes
df['status'] = df['status'].astype(str)
df2['status'] = df2['status'].astype(str)

#finally merge

new_df = df.merge(df2, on='status', how='left')

Ausgabe:

          status                     new_col
0   {'NOT_STARTED'}             yet_to_start_set
1   {'COMPLETED', 'NOT_STARTED'}    runn_set
2   {'COMPLETED', 'NOT_STARTED'}    runn_set
3   {'COMPLETED', 'NOT_LOADED'} fail_set2
4   {'COMPLETED', 'NOT_LOADED'} fail_set2
5   {'COMPLETED', 'NOT_LOADED'} fail_set2
6   {'NOT_STARTED'}             yet_to_start_set
7   {'COMPLETED'}               comp_set

Sie können ‘String Sets’ in tatsächliche Sets umwandeln mit eval:

new_df['status'] = new_df['status'].agg(eval)


Beantwortet von –
Nuri Taş


Antwort geprüft von –
Katrina (FixError Volunteer)

0 Shares:
Leave a Reply

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

You May Also Like