2013-10-03 4 views
17

Pandasのstr.contains()関数を使用して、2つの部分文字列を一度に検索する方が効率的な方法があるのだろうかと思います。 "nt"または "nv"のいずれかを含むデータのデータフレーム内の特定の列を検索したい。今、私のコードは次のようになります:データフレーム付きパンダでstr.contains()を使用

df[df['Behavior'].str.contains("nt", na=False)] 
    df[df['Behavior'].str.contains("nv", na=False)] 

そして次に私は別の結果を追加します。私がしたいのは、 "nt"または "nv"または "nf"を含むデータを検索するために、1行のコードを使用することです。私は、用語の間にパイプを張っているだけで動作するはずだと思ったいくつかの方法で遊んだことがありますが、これらのすべてがエラーになります。私はドキュメントをチェックしましたが、これはオプションではありません。

--------------------------------------------------------------------------- 
    TypeError         Traceback (most recent call last) 
    <ipython-input-113-1d11e906812c> in <module>() 
    3 
    4 
    ----> 5 soctol = f_recs[f_recs['Behavior'].str.contains("nt"|"nv", na=False)] 
    6 soctol 

    TypeError: unsupported operand type(s) for |: 'str' and 'str' 

これは簡単な方法ですか?何か助けてくれてありがとう、私は初心者ですが、データの争いにパンダが大好きです。

答えて

32

ザ・一つの正規表現で、1つの文字列にする必要があります:

In [1]: "nt" | "nv" 
TypeError: unsupported operand type(s) for |: 'str' and 'str' 
+2

おかげで、このような美しさ:

"nt|nv" # rather than "nt" | " nv" f_recs[f_recs['Behavior'].str.contains("nt|nv", na=False)] 

Pythonはあなたが文字列の上または(|)演算子を使用することはできません! 。パイプと検索語の間にはスペースがないように注意してください。 – jaknap32

+3

@ jaknap32: '(?x)'修飾子を使用する場合は、任意の場所に空白を追加することができます( ''(?x)nt | nv "' - (ただしパターンに意味のあるスペースがある場合は、 '#' char)だけでなく、それらをエスケープします。 [Python 're.X' docs](https://docs.python.org/2/library/re.html#re.VERBOSE)を参照してください。とにかく、 'n [tv]'は 'nt | nv'より良い正規表現です。 –

+0

"na = False"の式は+1です。私のデータにはギャップがあり、文字列には機能が含まれていません。 –

関連する問題