微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 关于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 
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] 举报,一经查实,本站将立刻删除。

相关推荐