如何在熊猫上应用切片系列字符串

问题描述:

我在玩pandas,并尝试将字符串切片应用于一系列字符串对象。 非但没有琴弦切片,该系列被切片:如何在熊猫上应用切片系列字符串

In [22]: s = p.Series(data=['abcdef']*20) 
In [23]: s.apply(lambda x:x[:2]) 
Out[24]: 
0 abcdef 
1 abcdef 

在另一方面:

In [25]: s.apply(lambda x:x+'qwerty') 
Out[25]: 
0  abcdefqwerty 
1  abcdefqwerty 
2  abcdefqwerty 
... 

我得到了它通过使用地图功能,而不是工作,但我想我错过了它应该如何工作。

非常感谢澄清。

+0

我不认为你错过了什么。 AFAIK,整个系列的操作应该是数字化的,而不是像字符串切片这样的事情。编辑:实际上,重新阅读API文档,也许不是:http://pandas.sourceforge.net/generated/pandas.Series.apply.html?highlight=apply#pandas-series-apply所以我不确定。 – AdamKG 2012-01-12 20:58:24

+4

切片熊猫?这只是意味着! – juliomalegria 2012-01-12 21:26:57

apply首先尝试将该功能应用于整个系列。只有在失败时它才会将给定的函数映射到每个元素。 [:2]是一个系列上的有效函数,+ 'qwerty'显然不是,这就是为什么你得到后者的隐式映射。如果你总是想要做映射,你可以使用s.map。参考

apply的源代码:

try: 
     result = func(self) 
     if not isinstance(result, Series): 
      result = Series(result, index=self.index, name=self.name) 
     return result 
    except Exception: 
     mapped = lib.map_infer(self.values, func) 
     return Series(mapped, index=self.index, name=self.name) 

你在正确的轨道上:

In [3]: s = Series(data=['abcdef']*20) 

In [4]: s 
Out[4]: 
0  abcdef 
1  abcdef 
2  abcdef 
3  abcdef 
4  abcdef 
5  abcdef 
6  abcdef 
7  abcdef 
8  abcdef 
9  abcdef 
10 abcdef 
11 abcdef 
12 abcdef 
13 abcdef 
14 abcdef 
15 abcdef 
16 abcdef 
17 abcdef 
18 abcdef 
19 abcdef 

In [5]: s.map(lambda x: x[:2]) 
Out[5]: 
0  ab 
1  ab 
2  ab 
3  ab 
4  ab 
5  ab 
6  ab 
7  ab 
8  ab 
9  ab 
10 ab 
11 ab 
12 ab 
13 ab 
14 ab 
15 ab 
16 ab 
17 ab 
18 ab 
19 ab 

我真的想添加一系列量化的,NA-友好字符串处理熊猫工具(See here)。始终感谢任何开发帮助。

韦斯麦金尼的答案是有点过时了,但他对他的愿望取得良好 - 大熊猫现在拥有高效的字符串处理方法,包括切片:

In [2]: s = Series(data=['abcdef']*20) 

In [3]: s.str[:2] 
Out[3]: 
0  ab 
1  ab 
2  ab 
...