Как применять нарезку на пандах Серия строк

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

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

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

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

сначала примените эту функцию к целой серии. Только если это не удается, он сопоставляет данную функцию каждому элементу. [: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) 

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

 In [2]: s = Series(data=['abcdef']*20) In [3]: s.str[:2] Out[3]: 0 ab 1 ab 2 ab ... 

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

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