Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫系列识别连续辅音的数量_Python_Regex_String_Pandas - Fatal编程技术网

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]+'