2017-08-23 17 views
5

これは私の最初の投稿ですので、うまくいけば私は疑問に思っていません。 基本的に、これは2つの部分からなる質問です。列A = "有効"かどうか最初にチェックするコードを設定する必要があります。これが当てはまる場合は、B列から部分文字列を抽出し、新しい列に配置する必要があります。ここには「C」というラベルが付けられています。条件が偽であれば、 "NA"を入れたいと思います。私の望む結果については、2番目の表を参照してください。条件付きでサブストリングをpandasデータフレームの新しい列にコピーする方法は?

|  A  |    B      | 
|-------------|-----------------------------------| 
| VALID |asdfafX'XextractthisY'Yeaaadf  | 
| INVALID |secondrowX'XsubtextY'Yelakj  | 
| VALID |secondrowX'XextractthistooY'Yelakj | 

|  A  |    B      |  C   | 
|-------------|-------------------------------------|-----------------| 
| VALID |"asdfafX'XextractthisY'Yeaaadf"  | extractthis  | 
| INVALID |"secondrowX'XsubtextY'Yelakj"  | NA    | 
| VALID |"secondrowX'XextractthistooY'Yelakj" | extractthistoo | 

注意すべきいくつかのこと:

-Theサブストリングが常にフレーズ "X'X" の後に起動して、右の "Y'Y" の前に終了します。

- 部分文字列は、セルからセルまでの長さが異なります。

私は次のコードが間違っている知っているが、私はこの問題を解決しようとしてきたどのようにお見せしたかった:

import pandas as pd 

if df[A] == "VALID": 
    df[C] = df[B]df.str[start:finish] 
else: 
    df[C].isna() 

私は新しい午前として、私は、この基本的なコードのエラーのために謝罪すべてのPythonとまだIDEと試用&私にご案内するエラーに依存しています。あなたが提供できるどんな助けもありがとうございます。

答えて

3

あなたはpd.Series.str.extractを使用することができます。

In [737]: df 
Out[737]: 
     A         B 
0 VALID  asdfafX'XextractthisY'Yeaaadf 
1 INVALID   secondrowX'XsubtextY'Yelakj 
2 VALID secondrowX'XextractthistooY'Yelakj 

In [745]: df['C'] = df[df.A == 'VALID'].B.str.extract("(?<=X'X)(.*?)(?=Y'Y)", expand=False) 

In [746]: df 
Out[746]: 
     A         B    C 
0 VALID  asdfafX'XextractthisY'Yeaaadf  extractthis 
1 INVALID   secondrowX'XsubtextY'Yelakj    NaN 
2 VALID secondrowX'XextractthistooY'Yelakj extractthistoo 

正規表現パターンは次のとおりです。

(?<=X'X)(.*?)(?=Y'Y) 
  • (?<=X'X)X'X

  • (.*?)ための後読みが後読みaとすべてに一致していますND

  • (?=Y'Y)を先読み私はあなただけで `DF [ 'C'] =のDF [df.A == 'VALID']に簡素化することができると思いY'Y

+2

ための先読みである。B.str。 '(?<= X'X)(。*?)(?= Y'Y)") 'df ['C']'を初期化する必要はなく、 'NaN'がデフォルトです。 – AChampion

+0

パーフェクト。それはトリックでした!これで助けていただきありがとうございます。 – ParalysisByAnalysis

関連する問題