8

私はパンダで遊んでいて、一連の文字列オブジェクトに文字列スライスを適用しようとしています。文字列をスライスする代わりに、シリーズをスライスします。

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
...

代わりに map 関数を使用して動作させましたが、動作するはずの方法について何かが欠けていると思います。

説明をいただければ幸いです。

4

3 に答える 3

7

あなたは正しい方向に進んでいます:

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対応の文字列処理ツールをたくさん追加したいと思います(ここを参照)。開発の助けにも常に感謝します。

于 2012-01-12T21:22:26.280 に答える
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)
于 2012-01-12T21:16:35.850 に答える