2012-01-12 3 views
8

Я играю с pandas и пытается применить нарезку строк в серии объектов строк. Вместо того, чтобы строки нарезанные, серия получает нарезанную:Как применять нарезку на 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 
... 

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

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

+0

Я не думаю, что вы ничего не хватает , AFAIK, операции по всей серии должны быть численными, а не такими, как нарезка строк. Изменить: на самом деле, перечитывая документы API, возможно, нет: http://pandas.sourceforge.net/generated/pandas.Series.apply.html?highlight=apply#pandas-series-apply Так что я не уверен , – AdamKG

+4

разрезанные панды? это просто значит! – juliomalegria

ответ

4

apply сначала пытается применить функцию к целой серии. Только если это не удается, он сопоставляет данную функцию каждому элементу. [:2] - действительная функция в ряду, + 'qwerty', по-видимому, нет, поэтому вы получаете неявное сопоставление с последним. Если вы всегда хотите сделать сопоставление, вы можете использовать s.map.

apply «s исходного кода для справки:

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) 
6

Вы находитесь на правильном пути:

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

8

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

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

In [3]: s.str[:2] 
Out[3]: 
0  ab 
1  ab 
2  ab 
... 
Смежные вопросы