Ausgabe
Ich habe einen Pandas-Datenrahmen (Variablenname box_status ), in dem eine Spalte SET
Werte 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 status
ist, 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)