我正在研究大熊猫对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
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
(...)
是否有一种简单的方法来扩展多值列带状疱疹,每行产生多行,一个用于在带状疱疹列表中找到的每个值?
另外,如果我按列组合分组,那么为列性别的每个可能值的计数生成不同的列是多么容易?
我设法理解了第二部分.例如,要计算每个名字的男性和女性数量:
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
解决方法:
这个方法应该很好地推广:
In [100]: df
Out[100]:
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]
首先创建一个“扩展”系列,其中每个条目都是一个木瓦.这里,系列的索引是多索引,其中第一级表示木瓦位置,第二级表示原始DF的索引:
In [103]: s = df.shingles.apply(lambda x: pandas.Series(x)).unstack();
Out[103]:
0 0 Joh
1 Mar
2 Jan
3 Joh
1 0 ohn
1 ary
2 ane
3 ohn
接下来,我们可以将创建的系列加入到原始数据框中.您必须重置索引,降低瓦片位置级别.生成的系列具有原始索引和每个木瓦的条目.将其合并到原始数据框中会产生:
In [106]: df2 = df.join(pandas.DataFrame(s.reset_index(level=0, drop=True))); df2
Out[106]:
gender name firstname shingles 0
0 M John Doe John [Joh, ohn] Joh
0 M John Doe John [Joh, ohn] ohn
1 F Mary Poppins Mary [Mar, ary] Mar
1 F Mary Poppins Mary [Mar, ary] ary
2 F Jane Doe Jane [Jan, ane] Jan
2 F Jane Doe Jane [Jan, ane] ane
3 M John Cusack John [Joh, ohn] Joh
3 M John Cusack John [Joh, ohn] ohn
最后,您可以对Gender执行groupby操作,取消堆叠返回的系列并用零填充NaN:
In [124]: df2.groupby(0, sort=False)['gender'].value_counts().unstack().fillna(0)
Out[124]:
F M
0
Joh 0 2
ohn 0 2
Mar 1 0
ary 1 0
Jan 1 0
ane 1 0
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。