2012-01-12 8 views
8

私は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のソースコード:あなたは正しい軌道に乗っている

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 
... 
関連する問題