如何在pandas上应用切片系列的字符串

dav*_*rai 8 python pandas

我正在玩大熊猫并尝试在一系列字符串对象上应用字符串切片.该系列不是切割字符串而是切片:

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)


Wes*_*ney 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
Run Code Online (Sandbox Code Playgroud)

我真的想在熊猫中添加一堆矢量化,NA友好的字符串处理工具(见这里).永远感谢任何开发帮助.


Rob*_*ers 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)
Run Code Online (Sandbox Code Playgroud)