2017-10-18 1 views
-3

Ich habe bereits unten Code gemacht, und es funktioniert gut, aber ich versuche, besser lesbaren und optimierten Code dafür zu machen ich bin meinen Code zu ersetzen, um Verständnis zu ersetzen, um alle "wenn Bedingungen" zu ersetzen zum Auffinden von emotion_class (in double **).List Comprehension für Multi-Label-Zähler

** Code in Liste Verständnis zu optimieren Versuch:

emotion_classes = ["Joy", "Fear", "Anger", "Surprise","Sadness", "Trust","Anticipation"] 

[increaseCounterofJoy,increaseCounterofFear, for emotion in emotion_classes] 

-Code

for idx in range(len(df_split)): 

    iter_df = df_split[idx] 

    i = 0 

    final_df = pd.DataFrame(columns=("Date","Joy", "Fear", "Anger", "Surprise","Sadness", "Trust","Anticipation")) 

    for index, row in iter_df.iterrows(): 

     **if iter_df["Emotion Class"] = "Joy": 
      row["Joy"] = +1 
     if iter_df["Emotion Class"] = "Fear": 
      row["Fear"] = +1 
     if iter_df["Emotion Class"] = "Anger": 
      row["Anger"] = +1 
     if iter_df["Emotion Class"] = "Surprise": 
      row["Surprise"] = +1 
     if iter_df["Emotion Class"] = "Sadness": 
      row["Sadness"] = +1 
     if iter_df["Emotion Class"] = "Trust": 
      row["Trust"] = +1 
     if iter_df["Emotion Class"] = "Anticipation": 
      row["Anticipation"] = +1** 

     final_df.loc[i] = row["Date"], row["Joy"], row["Fear"], row["Anger"], row["Surprise"], row["Sadness"], row["Trust"], row["Anticipation"] 

    i = i + 1 
+2

Ich habe nie die '**' Betreiber wie die verwendeten gesehen ... – bendl

+0

Warten Sie nur darauf, wo wir hinschauen sollen? – bendl

+0

Er benutzt es nur, um eine Region zu markieren, siehe die letzte Zeile der if-Kette – scnerd

Antwort

0

Vielleicht ein Pivot-Tisch?

In [1]: iter_df 
Out[1]: 
    Date Emotion Class 
0  1   Joy 
1  1   Peace 
2  2   Joy 
3  3   Peace 
4  3   Peace 

In [2]: iter_df['ones'] = 1 

In [3]: pd.pivot_table(iter_df, index='Date', columns='Emotion Class', values='ones', margins=False, aggfunc='sum') 
    ...: 
Out[3]: 
Emotion Class Joy Peace 
Date 
1    1.0 1.0 
2    1.0 NaN 
3    NaN 2.0 
+0

Well pivot_table gibt den Mittelwert, wenn agg nicht angegeben ist. Ich glaube nicht, dass OP einen Pivot-Tisch benötigt. – Dark

+0

Danke Final_df: alle Emotionsklassen mit der Anzahl der Emotionsklassen zählen +1 ist der Zähler zum Beispiel Joy: 10, Wut: 15, Traurigkeit: 25 ... so – Data

+0

Ich verstehe den Unterschied nicht ... sagst du nur dass du doppelte Gefühle pro Tag behandeln willst? Der Code behandelt das, ich habe die Daten in der Antwort aktualisiert, um dies zu demonstrieren. – scnerd

2

Dies ist keine Aufgabe ist, wo eine Liste Verständnis nützlich ist. Verwenden Sie einfach eine traditionelle for Schleife:

emotion_classes = [ 
    "Joy", "Fear", "Anger", "Surprise", 
    "Sadness", "Trust","Anticipation", 
] 

for index, row in iter_df.iterrows(): 
    for emotion in emotion_classes: 
     if iter_df["Emotion Class"] == emotion: 
      row[emotion] += 1 

ein paar Tippfehler in Ihrem Code Es gibt keine. Sie haben = anstelle von == in Ihren Tests. Und ich nehme an, dass Sie die entsprechenden Felder in row erhöhen möchten, anstatt sie nur auf +1 zu setzen.

+0

plus es behebt 2 böse Tippfehler. –

1

PM 2Ring Antwort funktioniert, aber ich frage mich, wenn Sie es nicht vereinfachen können mehr:

for index, row in iter_df.iterrows():  
    row[iter_df["Emotion Class"]] += 1 
+0

Guter Anruf. Ich denke, das würde funktionieren. Pandas kenne ich nicht, aber ich gehe davon aus, dass es mit fehlenden Schlüsseln umgehen kann, zB wenn der aktuelle Schlüssel 'emer_df [" Emotion Class "] noch nicht in' row' existiert. –

Verwandte Themen