Какой самый быстрый способ проверить, содержит ли ячейка буквы? - PullRequest
0 голосов
/ 07 мая 2019

У меня есть набор данных с 2,6 миллионами строк, в котором у меня есть один столбец с именем msgText, который содержит письменные сообщения.

Теперь я хочу отфильтровать все сообщения, которые не содержат букв.Для этого я нашел следующий код:

dataset = dataset[dataset['msgText'].astype(str).str.contains('[A-Za-z]')]

Однако через 16 часов код все еще работает.

Кроме того, на основе Есть ли в Python метод «содержит» подстроку для строки? Я думал о создании списка длиной 26, который содержит все буквы в алфавите, а затем проверял, является ли каждыйклетка содержит это письмо.Но это тоже не кажется эффективным.

Поэтому мне интересно, есть ли более быстрый способ определить, содержит ли клетка буквы.


РЕДАКТИРОВАТЬ: приведенный выше код работает очень хорошо.По-видимому, в моем (медленном) коде было: dataset['msgText'] = dataset[dataset['msgText'].astype(str).str.contains('[A-Za-z]')]

Ответы [ 2 ]

2 голосов
/ 07 мая 2019
import pandas

dataset['columnName'].apply(lambda x: x.find('\\w') > 0)
1 голос
/ 07 мая 2019

Вы можете использовать метод numpy's isalpha().(Numpy предположительно быстрее, чем pandas)

df = pd.DataFrame({'msgText': ['a', 'b', 'g', '1']})
column = df['msgText']
column[column.str.replace(' ','').str.isalpha()]

Возвращает:

0    a
1    b
2    g
Name: msgText, dtype: object

Тестовый пример с 2,6 млн. Строк:

datetime импорта

df = pd.DataFrame({'msgText': ['a', 'b', 'g', '1']*2600000})
column = df['msgText']
start = datetime.datetime.now()
new_col = column[column.str.replace(' ','').str.isalpha()]
end = datetime.datetime.now()
print(f'Time taken: {end - start}; Shape: {new_col.shape}')

OUTPUT:
Time taken: 0:00:06.144576; Shape: (7800000,)
...