从列表系列pandas中提取第一个字符

时间:2016-06-21 04:42:23

标签: python string pandas dataframe character

我有一个包含多个单词的字符串系列。我想以矢量化的方式提取每行每个单词的第一个字符。

到目前为止,我已经能够将单词拆分成一个列表,但还没有找到获取第一个字符的矢量化方法。

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]

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

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

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

希望它会有所帮助。