NLP とテキスト マイニングで簡単な計算を行うために pandas を調べていましたが、その方法をよく理解できませんでした。
人の名前と性別を関連付ける次のデータ フレームがあるとします。
import pandas
people = {'name': ['John Doe', 'Mary Poppins', 'Jane Doe', 'John Cusack'], 'gender': ['M', 'F', 'F', 'M']}
df = pandas.DataFrame(people)
私がしたいすべての行について:
- ファーストネームを決める
- 人の名前に由来する 3-shingles (単語に含まれる 3 文字のシーケンス) のリストを決定する
- 帯状疱疹ごとに、その帯状疱疹を名前に含む男性と女性の数を決定します。
目標は、これをデータセットとして使用して、与えられた名前がおそらく男性か女性かを判断できる分類子をトレーニングすることです。
最初の 2 つの操作は非常に簡単です。
def shingles(word, n = 3):
return [word[i:i + n] for i in range(len(word) - n + 1)]
df['firstname'] = df.name.map(lambda x : x.split()[0])
df['shingles'] = df.firstname.map(shingles)
結果は次のとおりです。
> print df
gender name firstname shingles
0 M John Doe John ['joh', 'ohn']
1 F Mary Poppins Mary ['mar', 'ary']
2 F Jane Doe Jane ['jan', 'ane']
3 M John Cusack John ['joh', 'ohn']
ここで、次のステップは、次のようなものを含む必要がある、性別とシングルの 2 つの列を持つ新しいデータ フレームを作成することによって実行する必要があります。
gender shingle
0 M joh
1 M ohn
2 F mar
3 F ary
(...)
そして、帯状疱疹と性別でグループ化できました。理想的には、結果は次のようになります。
shingle num_males num_females
0 joh 2 0
1 ohn 2 0
2 mar 0 1
3 ary 0 1
(...)
shingles
各行がシングルのリストで見つかった各値に対して 1 つずつ、複数の行を生成する方法で多値列を拡張する簡単な方法はありますか?
また、私groupby
が列の場合、列shingle
の可能な値ごとにカウントされた異なる列を作成するのはどれほど簡単gender
ですか?
後半部分は理解できました。例として、それぞれの男性と女性の数を計算するにはfirstname
:
def countMaleFemale(df):
return pandas.Series({'males': df.gender[df.gender == 'M'].count(),
'females': df.gender[df.gender == 'F'].count()})
grouped = df.groupby('first name')
その後:
print grouped.apply(countMaleFemale)
females males
first name
Jane 1 0
John 0 2
Mary 1 0