2016-06-21 3 views
1

У меня есть строка, содержащая краткие слова. Я хочу выделить первый символ каждого слова в строке в векторном виде.Извлечь первых символов из списка рядов pandas

До сих пор я мог разбить слова на список, но не нашел векторизованного способа получения первых символов.

s = pd.Series(['aa bb cc', 'cc dd ee', 'ff ga', '0w']) 

>>> s. str.split() 
0 [aa, bb, cc] 
1 [cc, dd, ee] 
2  [ff, ga] 
3   [0w] 

В конце концов, я хочу что-то вроде этого:

0 [a, b, c] 
1 [c, d, e] 
2  [f, g] 
3   [0] 

ответ

2

Еще быстрее решение вложен список понимание:

s2 = pd.Series([[y[0] for y in x.split()] for x in s.tolist()]) 
print (s2) 
0 [a, b, c] 
1 [c, d, e] 
2  [f, g] 
3   [0] 
dtype: object 

Спасибо clocker для улучшения - вы можете удалить tolist():

print (pd.Series([[y[0] for y in x.split()] for x in s])) 

Временные данные:

import pandas as pd 

s = pd.Series(['aa bb cc', 'cc dd ee', 'ff ga', '0w']) 
s = pd.concat([s]*10000).reset_index(drop=True) 
print(s) 

In [42]: %timeit pd.Series([[y[0] for y in x.split()] for x in s.tolist()]) 
10 loops, best of 3: 28.6 ms per loop 

In [43]: %timeit (s.str.split().map(lambda lst : [string[0] for string in lst])) 
10 loops, best of 3: 50.4 ms per loop 

In [44]: %timeit (s.str.split().apply(lambda lst: [list(elt)[0] for elt in lst])) 
10 loops, best of 3: 76.1 ms per loop 

In [59]: %timeit (pd.Series([[y[0] for y in x.split()] for x in s])) 
10 loops, best of 3: 28.8 ms per loop 
+0

Спасибо за рассмотрение эффективности. –

+0

Ответ от «jezrael» хороший. Просто хочу добавить, что для понимания списка, итерации по такой последовательности, как Series, не требуется метод .tolist(). Небольшая точка для небольших объемов данных, но может быть добавлена ​​для больших серий. 'pd.Series ([[y [0] для y в x.split()] для x в s])' будет работать нормально. – clocker

0

Вы можете попробовать это:

>>> s2 = s.str.split() 
>>> s2.apply(lambda lst: [list(elt)[0] for elt in lst]) 
0 [a, b, c] 
1 [c, d, e] 
2  [f, g] 
3   [0] 

Надеется, что это будет полезно.

1

Простым способом было бы использовать pandas.Series.map метод:

In [15]: s.str.split().map(lambda lst : [string[0] for string in lst]) 
Out[15]: 
0 [a, b, c] 
1 [c, d, e] 
2  [f, g] 
3   [0] 
dtype: object 
+0

Thanks. Не думал об использовании карты. Думаю, я буду использовать его более широко для этих операций. – rokman54

Смежные вопросы