2012-01-12 13 views
8

Sto giocando con pandas e sto provando ad applicare il taglio delle stringhe su un oggetto Serie di stringhe. Invece di ottenere le corde a fette, la serie viene affettato:Come applicare l'affettatura su panda Serie di stringhe

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

D'altra parte:

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

ho preso a lavorare utilizzando la funzione di carta, invece, ma penso di essere manca qualcosa su come dovrebbe funzionare.

Gradirei molto un chiarimento.

+0

Non credo che ti manca nulla . AFAIK, le operazioni su tutta la serie dovrebbero essere numeriche, non cose come il taglio delle stringhe. Modifica: in realtà, rileggendo i documenti API, forse no: http://pandas.sourceforge.net/generated/pandas.Series.apply.html?highlight=apply#pandas-series-apply Quindi non sono sicuro . – AdamKG

+4

affettare panda? è solo cattivo! – juliomalegria

risposta

4

apply prima prova ad applicare la funzione all'intera serie. Solo se fallisce, associa la funzione data a ciascun elemento. [:2] è una funzione valida su una serie, apparentemente non lo è, + 'qwerty', ecco perché ottieni la mappatura implicita su quest'ultima. Se vuoi sempre fare la mappatura puoi usare s.map.

apply s' il codice sorgente di riferimento:

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

Sei sulla strada giusta:

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 

mi piacerebbe davvero aggiungere un po' di vettorializzare, NA-friendly elaborazione delle stringhe strumenti in panda (See here). Apprezzo sempre anche qualsiasi aiuto allo sviluppo. risposta

8

Wes di McKinney è un po 'fuori moda, ma ha fatto bene il suo desiderio - panda ora ha metodi efficienti di elaborazione delle stringhe, tra cui affettare:

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

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