如何计算 pandas 数据框(大写和小写)中的元音和辅音?
How to count vowels and consonants in pandas dataframe (both uppercase and lowercase)?
这是我的数据
No Body
1 DaTa, Analytics
2 StackOver.
这是我的预期输出
No Body Vowels Consonant
1 DaTa, Analytics. 5 8
2 StackOver. 3 6
您可以使用非常简单的正则表达式计算元音的数量,而辅音的数量是所有字母减去元音的数量:
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
使用带有参数 re.I
的 str.count
忽略大小写:
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
试试这个:
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)
另一种选择是使用 or'd 条件应用 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
然后assign/join适合你原来的DF。
这是我的数据
No Body
1 DaTa, Analytics
2 StackOver.
这是我的预期输出
No Body Vowels Consonant
1 DaTa, Analytics. 5 8
2 StackOver. 3 6
您可以使用非常简单的正则表达式计算元音的数量,而辅音的数量是所有字母减去元音的数量:
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
使用带有参数 re.I
的 str.count
忽略大小写:
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
试试这个:
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)
另一种选择是使用 or'd 条件应用 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
然后assign/join适合你原来的DF。