如何在熊猫中保留字典词典(或具有类似功能的词典)?

时间:2017-03-01 19:00:43

标签: python pandas dictionary dataframe

所以我有一个包含许多列的大型数据框。让我们说我感兴趣的两个主要栏目是消息和名称。每条消息都会像个人身份一样,并附有此人的姓名。让我们说我有一个充满情感/感觉词汇的词汇,这些词汇相当庞大,但简洁的版本可能看起来像['悲伤',' happy','松了一口气,#39;愤怒'愤怒'狂喜','骄傲','失望'] 。对于每个名称(并且名称可以重复,因为它们可以有多个消息),我想跟踪他们使用的情感词及其附带的计数。例如(我已经做了这个,因为我有一个非常大的数据集):

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

如果我想要的东西基本上会告诉我以下内容(我不必关心格式,只要它干净):{Alice:happy:1,欣喜若狂:1;约翰:生气:1;丽莎:自豪:1,失望:1}。

最好/最简单的方法是什么?字典词典是最好的方法吗?其次(这是一个额外的相关问题),经过上面的计算,如果我想为每个名字找到最常用的情感词,该怎么办?在这个例子中,一切都与1相关,但想象一下计数是不一样的。

1 个答案:

答案 0 :(得分:3)

如果您正在寻找一种非常简单的方式来完成您所寻找的内容,我建议您将pandas groupby功能与collections utility结合使用。< / p>

初始状况

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

<强>输出:

                                      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]

按名称分组并应用计数器

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

<强>输出:

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

获取最频繁的单词

由于您还表示您想要获得最常见的情感词,您可以使用Counter.most_common(n)函数,其中n是要提取的最常用词的数量(在您的情况下为1):

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

<强>输出:

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

对于这个小例子,我使用以下函数来提取情感词。肯定可能有更好的方法(也许你已经在使用nltk,如果没有,我会建议你研究它)。

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)