Как получить список индексов для строк, начинающихся со строчной буквы? - PullRequest
3 голосов
/ 27 марта 2019

У меня есть датафрейм с одним из столбцов df ['Names'].Как я могу найти все строки, имена которых начинаются со строчной буквы?

col1     Names  
1564      abby   
2289      Barry  

и т. Д.

Я пытаюсь выполнить это с помощью регулярных выражений без удачи.

Ответы [ 3 ]

2 голосов
/ 27 марта 2019

В одну сторону, используя 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 голосов
/ 27 марта 2019

Если мы говорим о производительности, как насчет 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])
2 голосов
/ 27 марта 2019

в одну сторону от 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...