如何计算pandas数据框(大写和小写)中的元音和辅音?

时间:2018-03-12 11:41:21

标签: python regex pandas text feature-extraction

这是我的数据

No  Body
1   DaTa, Analytics
2   StackOver.

这是我的预期输出

No  Body                 Vowels   Consonant  
1   DaTa, Analytics.     5        8        
2   StackOver.           3        6 

4 个答案:

答案 0 :(得分:5)

你可以使用一个非常简单的RegEx来计算元音数量,辅音数量是所有字母的数量减去元音的数量:

In [121]: df['Vowels'] = df.Body.str.lower().str.count(r'[aeiou]')

In [122]: df['Consonant'] = df.Body.str.lower().str.count(r'[a-z]') - df['Vowels']

In [123]: df
Out[123]:
   No             Body  Vowels  Consonant
0   1  DaTa, Analytics       5          8
1   2       StackOver.       3          6

PS y may be either a vowel or a consonant ...

答案 1 :(得分:4)

另一种选择是将str.extractall与条件一起应用以有效地将事物分成两列,然后按索引分组并计算列数,例如:

counts = (
    df.Body.str.extractall('(?i)(?P<vowels>[aeiou])|(?P<consonants>[a-z])')
    .groupby(level=0).count()
)

这是因为正则表达式的(?i)指定表达式应该不区分大小写,并且[aeiou]将所有元音捕获到第一个匹配组(或列)中,然后[a-z]将捕获第一组未捕获的所有其他字母(除元音外的所有字母)。

给你:

   vowels  consonants
0       5           8
1       3           6

然后根据原始DF分配/加入。

答案 2 :(得分:3)

使用str.count参数re.I进行忽略大小写:

import re
df['Vowels'] = df['Body'].str.count(r'[aeiou]', flags=re.I)
df['Consonant'] = df['Body'].str.count(r'[bcdfghjklmnpqrstvwxzy]', flags=re.I)
print (df)
   No             Body  Vowels  Consonant
0   1  DaTa, Analytics       5          8
1   2       StackOver.       3          6

答案 3 :(得分:2)

试试这个:

vowels = set("AEIOUaeiou")
cons = set("bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ")

df['Vowels'] = [sum(1 for c in x if c in vowels) for x in df['Body']]
df['Consonents'] = [sum(1 for c in x if c in cons) for x in df['Body']]

print (df)