我正在玩大熊猫并尝试在一系列字符串对象上应用字符串切片.该系列不是切割字符串而是切片:
In [22]: s = p.Series(data=['abcdef']*20)
In [23]: s.apply(lambda x:x[:2])
Out[24]:
0 abcdef
1 abcdef
Run Code Online (Sandbox Code Playgroud)
另一方面:
In [25]: s.apply(lambda x:x+'qwerty')
Out[25]:
0 abcdefqwerty
1 abcdefqwerty
2 abcdefqwerty
...
Run Code Online (Sandbox Code Playgroud)
我通过使用map函数让它工作,但我想我错过了一些关于它应该如何工作的东西.
非常感谢澄清.
小智 12
Wes McKinney的答案有点过时,但他的意愿很好 - 熊猫现在拥有高效的字符串处理方法,包括切片:
In [2]: s = Series(data=['abcdef']*20)
In [3]: s.str[:2]
Out[3]:
0 ab
1 ab
2 ab
...
Run Code Online (Sandbox Code Playgroud)
你走在正确的轨道上:
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
Run Code Online (Sandbox Code Playgroud)
我真的想在熊猫中添加一堆矢量化,NA友好的字符串处理工具(见这里).永远感谢任何开发帮助.
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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4651 次 |
| 最近记录: |