如何对字符串的pandas Series进行切片
我在玩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
...
我用map函数让它工作了,但我觉得我对它应该如何运作还有些不太明白。
非常希望能得到一些解释。
3 个回答
7
你走在正确的道路上:
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
我真的很想在pandas里添加一些可以处理字符串的工具,这些工具可以处理向量化的数据,并且对缺失值(NA)友好(可以在这里查看)。我也非常欢迎任何开发方面的帮助。
12
Wes McKinney的回答有点过时,不过他实现了自己的愿望——pandas现在有了高效的字符串处理方法,包括字符串切片:
In [2]: s = Series(data=['abcdef']*20)
In [3]: s.str[:2]
Out[3]:
0 ab
1 ab
2 ab
...
4
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)