如何获取以小写字母开头的行的索引列表?

问题描述 投票:3回答:3

我有一个数据框,其中一列是df ['Names']。如何找到名称以小写字母开头的所有行?

col1     Names  
1564      abby   
2289      Barry  

等等

我正试图用正则表达式来完成这个,没有运气。

python regex pandas
3个回答
2
投票

str.lower的一个方向

df[df.Names.str[0]==df.Names.str[0].str.lower()]
Out[173]: 
   col1 Names
0  1564  abby

另一种方式islower

df[df.Names.str[0].str.islower()]
Out[174]: 
   col1 Names
0  1564  abby

2
投票

使用string.ascii_lowercase的一种方法

import string
df.loc[df.Names.str[0].isin(list(string.ascii_lowercase))]

使用regex的另一种方式

df[df.col.str.match('[a-z].*')]

一些时间

df = pd.DataFrame({'col': ['abc', 'Abc', 'dce', 'ADAE']})
df = pd.concat([df]*100)

%%timeit 
a = df['col'].values.astype('<S1').view(np.int8)
df[(a >= 97) & (a <= 122)]
302 µs ± 21.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit df.col.str[0].isin(list(string.ascii_lowercase))
548 µs ± 13 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit df[df.col.str.islower()]
559 µs ± 28.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

 %timeit df[df.col.str.match('[a-z].*')]
838 µs ± 17.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit df[df.col.str[0]==df.col.str[0].str.lower()]
1.59 ms ± 65 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 

2
投票

如果我们谈论表演,NumPy怎么样?将系列转换为字符串数组,提取第一个字符并比较ASCII值。

a = df['Names'].values.astype('<S1').view(np.int8)
df[(a >= 97) & (a <= 122)]

   col1 Names
0  1564  abby

如果您只需要索引,请使用np.nonzero

(a >= 97) & (a <= 122)
# array([ True, False])

np.flatnonzero((a >= 97) & (a <= 122))
# array([0])
© www.soinside.com 2019 - 2024. All rights reserved.