2016-06-22 7 views
1

dframeというDataFrameからPATHという名前のpandas列をスライスして、AD1positionという新しい列に拡張子を持つAD1コンテナのファイル名を取得しようとしています。言い換えれば一致する部分文字列の位置に基づいてパンダ列をスライスする

  PATH 
0   \ 
1   \abc.ad1\xaxaxa 
2   \defghij.ad1\wbcbcb 
3   \tuvwxyz.ad1\ydeded 

、ここで私が見たいものだ:

  PATH      AD1position 
0   \ 
1   \abc.ad1\xaxaxa   abc.ad1 
2   \defghij.ad1\wbcbcb  defghij.ad1 
3   \tuvwxyz.ad1\ydeded  tuvwxyz.ad1 

私はExcelでこれを行うにした場合は、私が書くでしょう:Pythonで

=if(iserror(search(".ad1",[PATH])),"",mid([PATH],2,search(".ad1",[PATH]) + 3)) 

を、私はように見えます立ち往生する。ここで私はこれまでに書いたものです。これを行う

dframe['AD1position'] = dframe['PATH'].apply(lambda x: x['PATH'].str[1:(x['PATH'].str.find('.ad1')) \ 
            + 3] if x['PATH'].str.find('.ad1') != -1 else "") 

次のエラーが返されます。

TypeError: string indices must be integers 

私は問題はスライサーで機能によって生じていると思われるが、私は持つ任意の助けをいただければと思いますこれを解決する方法を考え出す。

答えて

0

使用.str.extract()機能:。

In [17]: df['AD1position'] = df.PATH.str.extract(r'.*?([^\\]*\.ad1)', expand=True) 

In [18]: df 
Out[18]: 
        PATH AD1position 
0     \   NaN 
1    \aaa\bbb   NaN 
2    \byz.ad1  byz.ad1 
3  \abc.ad1\xaxaxa  abc.ad1 
4 \defghij.ad1\wbcbcb defghij.ad1 
5 \tuvwxyz.ad1\ydeded tuvwxyz.ad1 
+0

これは最高の答えでした。私はパンダをv.18.1にアップデートして、expand引数を使用できると答えました。あなたの関数が "\ aaa \ axy.ad1 \ bbbbb"というPATHの可能性をカバーしているように見えますが、 "\ byz.ad1"のような値を扱うかどうかはわかりません。 )または "\ def.ad1.ad1 \ ccccc"(つまり、ファイル名の拡張子を繰り返します)が、私はここからうまくいくはずです。 – Xavier

+0

@Xavier、あなたは正しいです - 私は私の答えを訂正しました、確認してください – MaxU

0

これにより、分割の最初の要素が得られます。

df['AD1position'] = df.PATH.str.split('\\').str.get(1) 

ありがとうございます。

+0

あなたは 'df.PATH.str.splitを行うことができます( '\\')str.get(1)'が、パスの一部が含まれます '」 .ad1は常に要素1ですか?それはサンプルデータにありますが、これがいつもそうであるかどうかという疑問から私には不明です。 – root

+0

私は反例の例はありません。 KISS法が必要です。 – Back2Basics

+0

これはどのように機能しますか? (2番目の "str"はリストを文字列に変換しませんか?)これは1文字を返すべきではありませんか?はい、私はそれを試して、それは動作します...どのように? – Back2Basics

関連する問題