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

时间:2019-03-27 01:46:12

标签: python regex pandas

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

col1     Names  
1564      abby   
2289      Barry  

我正在尝试使用正则表达式来实现这一目标,而没有运气。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 :(得分: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])