如何对字符串的pandas Series进行切片

8 投票
3 回答
5346 浏览
提问于 2025-04-17 10:07

我在玩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)

撰写回答