2017-03-01 2 views
2

So habe ich einen großen Datenrahmen mit vielen Spalten. Sagen wir, die zwei Hauptspalten, die mich interessieren, sind Nachrichten und Namen. Jede Nachricht ist so etwas wie ein persönlicher Status und wird von dem Namen der Person begleitet. Nehmen wir an, ich habe eine Wortbank von Gefühlen/Gefühlen, die ziemlich groß sind, aber eine komprimierte Version könnte wie [traurig, glücklich, erleichtert, verärgert, wütend, ekstatisch, stolz] aussehen ',' enttäuscht ']. Für jeden Namen (und Namen könnten wiederholt werden, da sie mehrere Nachrichten haben könnten), möchte ich die Emotionsworte, die sie verwendet haben, und die zugehörigen Zählungen verfolgen. Zum Beispiel (ich habe dies seit ich eine wirklich große Datenmenge habe aus):Wie man ein Wörterbuch von Wörterbüchern (oder etwas mit ähnlicher Funktionalität) in Pandas behält?

Message          Name 
I am really happy with my progress.   Alice 
I was annoyed by his inconsideration.  John 
I felt proud after seeing her performance. Lisa 
I am ecstatic after hearing the good news. Alice 
I felt disappointed by her dishonesty  Lisa 

Wenn ich etwas wollte, das mir im Wesentlichen sagen würde folgend (ich nicht unbedingt über das Format kümmern, solange es sauber ist): {Alice: glücklich: 1, ekstatisch: 1; John: genervt: 1; Lisa: stolz: 1, enttäuscht: 1}.

Was ist der beste/einfachste Weg, dies zu tun? Ist ein Lexikon der Wörterbücher der beste Weg, dies zu tun? Zweitens (dies ist eine Art zusätzliche Frage), nach der obigen Berechnung, was ist, wenn ich das am häufigsten verwendete Emotionswort für jeden Namen finden möchte. In diesem Beispiel ist alles ziemlich gleich 1, aber stellen Sie sich vor, dass die Zählungen nicht gleich waren.

+0

Wenn eine Zeile zweimal "message" enthält, möchten Sie sie als eins oder zwei zählen? – exp1orer

+0

Wie in zum Beispiel, die Nachricht für eine einzelne Zeile hat zweimal "glücklich"? Ich hatte nicht wirklich daran gedacht, aber zweimal ist gut. –

Antwort

3

Wenn Sie suchen eine sehr leicht Art und Weise zu bewerkstelligen, was Sie suchen, mich mit den collections utility den Pandas groupby Funktionalität in Kombination mit vermuten wäre.

Ausgangssituation

df = pd.read_csv('messages.csv') 
df['Emotion Words'] = df.Message.apply(extract_emotion_words) 
print(df) 

Ausgang:

         Message Name Emotion Words 
0   I am really happy with my progress. Alice   [happy] 
1  I am really happy with johns progress. Alice   [happy] 
2  I was annoyed by his inconsideration. John  [annoyed] 
3 I felt proud after seeing her performance. Lisa   [proud] 
4 I am ecstatic after hearing the good news. Alice  [ecstatic] 
5  I felt disappointed by her dishonesty Lisa [disappointed] 

Gruppe nach Name und Anwenden Zähler

from collections import Counter 
df.groupby('Name')['Emotion Words'].sum().apply(Counter) 

Ausgang:

Name 
Alice  {'happy': 2, 'ecstatic': 1} 
John      {'annoyed': 1} 
Lisa  {'disappointed': 1, 'proud': 1} 
dtype: object 

Get Häufige Wort

Da Sie zeigte auch, dass Sie die häufigste Emotion Wort erhalten möchten, können Sie die Counter.most_common(n) Funktion verwenden, wo n ist die Anzahl der am häufigsten verwendeten Wörter (in Ihrem Fall zu extrahieren 1):

df.groupby('Name')['Emotion Words'].sum().apply(
    lambda words: Counter(words).most_common(1) 
) 

Output:

Name 
Alice   [(happy, 2)] 
John   [(annoyed, 1)] 
Lisa  [(disappointed, 1)] 
dtype: object 

Für dieses kleine Beispiel habe ich die folgende Funktion verwendet, um die Emotionsworte zu extrahieren. Es gibt sicher bessere Möglichkeiten, es zu tun (vielleicht verwenden Sie bereits die nltk, wenn nicht, würde ich vorschlagen, dass Sie sich damit befassen).

import re 

emotionWords = set(['sad', 'happy', 'relieved', 'annoyed', 'angry', 'ecstatic', 'proud', 'disappointed']) 

def extract_emotion_words(message): 
    tokenized = re.split(r'\W+', message.lower()) 
    return list(set(tokenized) & emotionWords) 
+0

Das sieht gut aus! Vielen Dank!! Wenn es dir nichts ausmacht, ein wenig mehr zu helfen, könntest du kurz die 'df.groupby ('Name') ['Emotion Words'] erklären.sum(). apply (Counter) 'line ein wenig mehr? Ich verstehe, dass Sie die Emotionsworte nach Namen gruppieren, aber ich bin ein wenig unsicher, wie die '.sum(). Apply (Counter)' funktioniert. Was auch, wenn ich das maximal auftretende Emotionswort pro Name bekommen wollte? Nochmals, ich schätze deine Hilfe sehr! –

+0

@JaneSully Ja sicher, wenn Sie Daten gruppieren, müssen Sie eine Aggregationsfunktion bereitstellen. Wenn Sie dies mit numerischen Werten vergleichen, möchten Sie möglicherweise den Medianwert aggregieren. für eine Anzahl von Listen (unsere Emotionswörter) "summieren" wir uns, was in diesem Fall bedeutet, dass wir die einzelnen Listen verketten (so '['glücklich]] + [' stolz ']' bekommt '[' glücklich ',' stolz ']'). Danach wenden wir den 'Counter' an, der zu dieser" Häufigkeitstabelle "führt. –

+0

das macht völlig Sinn. Danke für die klare Erklärung. Letzte Frage, wenn Sie ein bisschen mehr helfen können. Wenn ich das maximal vorkommende Wort für jeden Namen finden wollte (stell dir vor, die Zahlen für glücklich und enttäuscht wären zwei), so würde ich etwas zurückgeben wollen Alice: glücklich, John: genervt und Lisa: enttäuscht, wie würde ich vorgehen tust du das? –

Verwandte Themen