Как нанести нарезку на панды Серия струн - PullRequest
8 голосов
/ 13 января 2012

Я играю с пандами и пытаюсь применить нарезку строк на объекте серии строк. Вместо того, чтобы разрезать строки, серия разрезается:

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
...

Я заставил его работать, используя вместо этого функцию карты, но я думаю, что мне чего-то не хватает в том, как она должна работать.

Буду очень признателен за разъяснение.

Ответы [ 3 ]

12 голосов
/ 26 января 2015

Ответ Уэса МакКинни немного устарел, но он выполнил свое желание - у панд теперь есть эффективные методы обработки строк, включая нарезку:

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

In [3]: s.str[:2]
Out[3]:
0     ab
1     ab
2     ab
...
7 голосов
/ 13 января 2012

Вы на правильном пути:

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 инструментов для обработки строк ( См. Здесь ).Всегда благодарны за любую помощь в разработке.

4 голосов
/ 13 января 2012

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...