2017-03-01 10 views
2

私は多くの列を持つ大きなデータフレームを持っています。私が興味を持っている2つの主要なコラムはメッセージと名前です。各メッセージは個人的な状態のようなものになり、その人の名前が付随します。かなり巨大ですが、凝縮されたバージョンは、[悲しい、幸せな、安心した、怒っている、怒っている、恍惚状態、誇りに思う'、' disappointed ']。名前ごとに(そして複数のメッセージを持つことができるので名前を繰り返してもかまいません)、使用した感情語とそれに付随する数を追跡したいと思います。例えば(私は本当に大きなデータセットを持っているので、私はこれを作っています):パンダに辞書の辞書(または類似の機能を持つもの)を保存するにはどうすればいいですか?

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 

私は基本的に私に次のことを言うだろう何かを望んでいた場合は(私は必ずしも限り、それはきれいだとフォーマットを気にしません):{アリス:幸せ:1、恍惚状態:1;ジョン:悩まされる:1;リサ:誇り高い:1、失望した:1}

これを行う最も簡単な方法は何ですか?辞書の辞書はこれを行うための最善の方法ですか?第二に、これは追加の関連する質問の一種です。上記の計算の後、各名前に最も頻繁に使用される感情語を探したい場合はどうしたらいいですか?この例では、すべてが1でかなり結びついていますが、カウントが同じではないと想像してください。

+0

1行に 'message'が2回ある場合、それを1つか2つと数えたいですか? – exp1orer

+0

たとえば、1行のメッセージに「happy」が2回ありますか?私はそれについて本当に考えていなかったが、2倍は良い。 –

答えて

3

あなたが探しているものを達成するのは非常に簡単な方法を探しているなら、私はcollections utilityとの組み合わせでパンダgroupby機能を使用してお勧めします。

初期状況

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) 

出力:

また、あなたは、あなたがあなたのケースで( nを抽出するための最も一般的な単語の数がある Counter.most_common(n)機能を使用することができ、最も一般的な感情の単語を取得したいことが示されているので
Name 
Alice  {'happy': 2, 'ecstatic': 1} 
John      {'annoyed': 1} 
Lisa  {'disappointed': 1, 'proud': 1} 
dtype: object 

は最多のWord

を取得します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を使っていますが、そうでないと私はそれを調べることをお勧めします)。

+0

これは素晴らしいですね!ありがとうございました!!もっと手伝ってもらえない場合は、簡単に 'df.groupby( 'Name')['Emotion Words']について説明してください。sum()。apply(Counter) '行を少しだけ追加しますか?私は感情の言葉を名前でグループ化していることを知っていますが、 '.sum()。apply(Counter)'の仕組みは少し不明です。また、名前ごとに最大の感情的な言葉を得たいと思ったらどうしますか?繰り返しますが、本当にありがとうございます! –

+0

@ JaneSullyはい、データをグループ化するときは、集計関数を指定する必要があります。これを数値と比較すると、中央値を取って集計することができます。この場合、個々のリストを連結することを意味する(つまり、「[happy]] + ['proud'] '' '' happy ''、 'proud'] ' )。その後、「カウンタ」を適用してこの「頻度表」を作成します。 –

+0

は完全に意味があります。明確な説明をありがとう。あなたがもう少しお手伝いできれば、最後の質問。私は各名前の最大の出現語を見つけたいと思っていました(幸せと失望のカウントは2つだと想像してください)ので、私は何かを返そうと思っています:幸せ、ジョン:苛立ち、リサ:そうする? –

関連する問題