我正在研究 pandas 以对 NLP 和文本挖掘进行一些简单的计算,但我无法完全掌握如何去做。
假设我有以下数据框,将人们的姓名和性别联系起来:
import pandas
people = {'name': ['John Doe', 'Mary Poppins', 'Jane Doe', 'John Cusack'], 'gender': ['M', 'F', 'F', 'M']}
df = pandas.DataFrame(people)
对于我想要的所有行:
- 确定名字
- 确定从人名派生的 3-shingles 列表(单词中包含 3 个字母的序列)
- 确定,对于每个带状疱疹,有多少男性和女性在他们的名字上包含该带状疱疹。
目标是将其用作数据集来训练分类器,该分类器可以确定给定名称是男性名字还是女性名字。
前两个操作非常简单:
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']
现在,下一步应该通过构建一个包含两列的新数据框来完成:gender 和 shingle,其中应该包含以下内容:
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
,每行产生多行,一个用于在带状疱疹列表中找到的每个值?
另外,如果我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')
接着:
打印 grouped.apply(countMaleFemale)
females males
first name
Jane 1 0
John 0 2
Mary 1 0