2012-01-12 11 views
8

Estoy jugando con pandas y trato de aplicar un corte de cadena en un objeto Serie de cuerdas. En lugar de obtener las cuerdas en rodajas, la serie se cortó:Cómo aplicar el corte en pandas Serie de cadenas

In [22]: s = p.Series(data=['abcdef']*20) 
In [23]: s.apply(lambda x:x[:2]) 
Out[24]: 
0 abcdef 
1 abcdef 

Por otro lado:

In [25]: s.apply(lambda x:x+'qwerty') 
Out[25]: 
0  abcdefqwerty 
1  abcdefqwerty 
2  abcdefqwerty 
... 

lo tengo para trabajar mediante el uso de la función de mapa en su lugar, pero creo que estoy falta algo sobre cómo se supone que debe funcionar.

Agradecería mucho una aclaración.

+0

No creo que se está perdiendo nada . AFAIK, se supone que las operaciones en toda la serie son numéricas, no cosas como el corte de cuerdas. Editar: en realidad, al volver a leer los documentos API, tal vez no: http://pandas.sourceforge.net/generated/pandas.Series.apply.html?highlight=apply#pandas-series-apply Así que no estoy seguro . – AdamKG

+4

rebanando pandas? eso es solo malo! – juliomalegria

Respuesta

4

apply primero intenta aplicar la función a toda la serie. Solo si eso falla asigna la función dada a cada elemento. [:2] es una función válida en una serie, + 'qwerty' aparentemente no lo es, es por eso que obtiene la asignación implícita en este último. Si siempre quiere hacer la asignación, puede usar s.map.

apply 's código fuente de referencia:

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

Estás en el camino correcto:

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 

Realmente me gustaría añadir un montón de vectorizado, el procesamiento de cadenas NA-amigable herramientas en pandas (See here). Siempre aprecie cualquier ayuda de desarrollo también. respuesta

8

Wes de McKinney es un poco fuera de fecha, pero cumplió su deseo - pandas ahora cuenta con métodos de procesamiento de cadenas eficientes, incluyendo rebanar:

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

In [3]: s.str[:2] 
Out[3]: 
0  ab 
1  ab 
2  ab 
... 
Cuestiones relacionadas