2016-06-21 90 views
1

我有一個包含多個單詞的字符串系列。我想以矢量化的方式提取每行每個單詞的第一個字符。從列表系列熊貓中提取第一個字符

到目前爲止,我已經能夠將單詞分成列表,但還沒有找到獲取第一個字符的矢量化方法。

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] for x.split()] for x in 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

謝謝。沒有考慮使用地圖。想想我會更廣泛地使用它來進行這些類型的操作。 – rokman54