从列表系列熊猫中提取第一个字符
问题描述:
我有一个包含多个单词的字符串系列。我想以矢量化的方式提取每行每个单词的第一个字符。从列表系列熊猫中提取第一个字符
到目前为止,我已经能够将单词分成列表,但还没有找到获取第一个字符的矢量化方法。
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]
答
另一种更快的解决方案是嵌套列表理解:
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
答
你可以试试这个:
>>> 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]
希望能对大家有所帮助。
答
一个简单的方法是使用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
感谢您考虑效率。 –
“jezrael”的答案是一个很好的答案。只是想补充一点,对于列表理解,迭代诸如Series之类的序列不需要.tolist()方法。少量数据的小点,但可以添加大型系列。 'pd.Series([[y [0] for x.split()] for x in s])'会正常工作。 – clocker