Python 熊猫系列识别连续辅音的数量
给定一个Python 熊猫系列识别连续辅音的数量,python,regex,string,pandas,Python,Regex,String,Pandas,给定一个系列字符串,我试图计算一个新的系列,它包含原始字符串中连续计数最高的辅音,忽略空格 例如,给定df['names'],我想确定df['max\u辅音']如下: In [1]: df Out[1]: names max_consonants 0 will hunting 2 1 sean maguire 1 2 gerald lambeau 2 3
系列
字符串,我试图计算一个新的系列
,它包含原始字符串中连续计数最高的辅音,忽略空格
例如,给定df['names']
,我想确定df['max\u辅音']
如下:
In [1]: df
Out[1]:
names max_consonants
0 will hunting 2
1 sean maguire 1
2 gerald lambeau 2
3 chuckie sullivan 2
4 mike krzyzewski 5
在pandas
之外,我可以使用re
模块执行此操作,如下所示:
In [2]: def max_consonants(s):
return max(len(i) for i in re.findall(r'[^aeiou ]+', s))
In [3]: max_consonants('mike krzyzewski')
Out[3]: 5
我知道我可以使用pd.Series.apply
在系列
上使用max_辅音
函数,但它没有矢量化。我正在处理包含2-3mm行/名称的数据,因此我正在寻找最有效的解决方案
有没有一个更优雅的熊猫本机解决方案可以让我利用矢量化?你可以试试,它也可以用于特殊字符,因为
\W
。但请注意,\W
也会捕获数字,因此如果您还想对这些数字进行拆分,则需要将0-9
添加到拆分所使用的正则表达式中:
df['names'].str.split(r'[AaEeIiOoUu\W]', expand=True).fillna('').applymap(len).max(axis='columns')
根据测试数据:
raw="""idx names max_consonants
0 will hunting 2
1 sean maguire 1
2 gerald lambeau 2
3 chuckie sullivan 2
4 mike krzyzewski 5
5 mike krzyzewski12345678 5
"""
df= pd.read_csv(io.StringIO(raw), sep='\s{2,}', index_col=[0])
其结果是:
idx
0 2
1 1
2 2
3 2
4 5
5 8
dtype: int64
applymap
之前的中间结果如下所示:
Out[89]:
0 1 2 3 4 5 6 7
idx
0 w ll h nt ng
1 s n m g r
2 g r ld l mb
3 ch ck s ll v n
4 m k krzyz wsk
5 m k krzyz wsk 12345678
性能说明:我希望<>代码> MaPoP(LeN)< /C> >被翻译成高效的C++操作,但不能用我的数据验证它。如果此解决方案出现性能问题,您可以尝试一种变体,在该变体中执行所有操作,直到
applymap
,用列上的循环替换applymap,然后执行.str.len()
。大致如下所示:
df_consonant_strings= df['names'].str.split(r'[AaEeIiOoUu\W]', expand=True).fillna('')
ser_max= None
for col in df_consonant_strings.columns:
ser_col= df_consonant_strings[col].str.len()
if ser_max is None:
ser_max= ser_col
else:
ser_max= ser_max.where(ser_max>ser_col, ser_col)
# now ser_max contains the desired maximum length of consonant substrings
[^aeiou]
也匹配§
,“
等,而不仅仅是辅音。@WiktorStribiżew,很好的观点。幸运的是,我的数据库不包含任何特殊字符,但为了完整性起见,我可以将正则表达式模式更改为'[bcdfghjklmnpnpqrstvwxyz]+'