2012-01-12 29 views
8

Tôi đang chơi với pandas và cố gắng áp dụng chuỗi cắt trên một chuỗi đối tượng chuỗi. Thay vì nhận được chuỗi thái lát, bộ phim được thái lát:Làm thế nào để áp dụng cắt trên gấu trúc Loạt các chuỗi

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

Mặt khác:

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

tôi đã nhận nó để làm việc bằng cách sử dụng các chức năng bản đồ thay vào đó, nhưng tôi nghĩ tôi thiếu một cái gì đó về cách nó phải làm việc.

Sẽ rất đánh giá cao việc làm rõ.

+0

Tôi không nghĩ rằng bạn đang bỏ lỡ bất cứ điều gì . AFAIK, các hoạt động trên toàn bộ chuỗi được cho là số, không phải những thứ như cắt chuỗi. Chỉnh sửa: trên thực tế, khi đọc lại tài liệu API, có thể không: http://pandas.sourceforge.net/generated/pandas.Series.apply.html?highlight=apply#pandas-series-apply Vì vậy, tôi không chắc chắn . – AdamKG

+4

cắt gấu trúc? điều đó chỉ có nghĩa là! – juliomalegria

Trả lời

4

apply đầu tiên cố gắng áp dụng chức năng cho toàn bộ chuỗi. Chỉ khi nó thất bại, nó ánh xạ hàm đã cho cho mỗi phần tử. [:2] là một chức năng hợp lệ trên một loạt, + 'qwerty' dường như không phải là, đó là lý do tại sao bạn có được ánh xạ ngầm trên thứ hai. Nếu bạn luôn muốn lập bản đồ, bạn có thể sử dụng s.map.

apply của mã nguồn để tham khảo:

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

Bạn đang đi đúng hướng:

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 

Tôi thực sự muốn thêm một loạt các vectorized, xử lý chuỗi NA-thân thiện công cụ trong gấu trúc (See here). Luôn luôn đánh giá cao bất kỳ sự trợ giúp phát triển nào. câu trả lời

8

Wes McKinney là một chút trong ngày, nhưng ông đã làm tốt về mong muốn của mình - gấu trúc hiện nay có phương pháp xử lý chuỗi hiệu quả, bao gồm cắt:

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

In [3]: s.str[:2] 
Out[3]: 
0  ab 
1  ab 
2  ab 
... 
Các vấn đề liên quan