2016-11-21 6 views
2

numpyのwhere条件の使用に関する質問があります。私はwhere ==演算子でconditionを使用することはできますが、 "where is another string?"という文字列を使用することはできません。Python numpy where関数の動作

CODE:

import pandas as pd 
    import datetime as dt 
    import numpy as np 

    data = {'name': ['Smith, Jason', 'Bush, Molly', 'Smith, Tina',  
     'Clinton,  Jake', 'Hamilton, Amy'], 
     'age': [42, 52, 36, 24, 73], 
     'preTestScore': [4, 24, 31, 2, 3], 
     'postTestScore': [25, 94, 57, 62, 70]} 
    df = pd.DataFrame(data, columns = ['name', 'age', 'preTestScore',  
    'postTestScore']) 
    print "BEFORE---- " 
    print df 
    print "AFTER----- " 
    df["Smith Family"]=np.where("Smith" in df['name'],'Y','N') 
    print df 

OUTPUT:

BEFORE----- 

       name age preTestScore postTestScore 
    0 Smith, Jason 42    4    25 
    1 Bush, Molly 52   24    94 
    2 Smith, Tina 36   31    57 
    3 Clinton, Jake 24    2    62 
    4 Hamilton, Amy 73    3    70 


    AFTER----- 
       name age preTestScore postTestScore Smith Family 
    0 Smith, Jason 42    4    25   N 
    1 Bush, Molly 52   24    94   N 
    2 Smith, Tina 36   31    57   N 
    3 Clinton, Jake 24    2    62   N 
    4 Hamilton, Amy 73    3    70   N 

numpy.where条件は上記の場合には動作しませんなぜ。 は値 N Y N N

Y を持つようにスミスファミリーを予想していた。しかし、その出力を取得できませんでした。上記の出力はすべてN、N、N、N、Nです df ['name']で条件 "Smith"を使用する代わりにstr(df ['name'])を試してみてくださいfind( "Smith")> -1)でも動作しませんでした。

何が間違っているのか、何が違うのですか?

答えて

3

は、私はあなたがboolean型マスクにstr.contains必要があると思う:

print (df['name'].str.contains("Smith")) 
0  True 
1 False 
2  True 
3 False 
4 False 
Name: name, dtype: bool 

df["Smith Family"]=np.where(df['name'].str.contains("Smith"),'Y','N') 
print (df) 
       name age preTestScore postTestScore Smith Family 
0  Smith, Jason 42    4    25   Y 
1  Bush, Molly 52   24    94   N 
2  Smith, Tina 36   31    57   Y 
3 Clinton,  Jake 24    2    62   N 
4  Hamilton, Amy 73    3    70   N 

またはstr.startswith

df["Smith Family"]=np.where(df['name'].str.startswith("Smith"),'Y','N') 
print (df) 
       name age preTestScore postTestScore Smith Family 
0  Smith, Jason 42    4    25   Y 
1  Bush, Molly 52   24    94   N 
2  Smith, Tina 36   31    57   Y 
3 Clinton,  Jake 24    2    62   N 
4  Hamilton, Amy 73    3    70   N 

apply必要スカラーで作業inを使用する場合:このソリューションは、高速である

、列nameNaNの場合は機能しません。

df["Smith Family"]=np.where(df['name'].apply(lambda x: "Smith" in x),'Y','N') 
print (df) 
       name age preTestScore postTestScore Smith Family 
0  Smith, Jason 42    4    25   Y 
1  Bush, Molly 52   24    94   N 
2  Smith, Tina 36   31    57   Y 
3 Clinton,  Jake 24    2    62   N 
4  Hamilton, Amy 73    3    70   N 
+0

はいjezrael。あなたの答えはうまくいき、とても役に立ちました。 –

+0

np.where()が==では動作するが、str関数ではstring findまたはsubstrと一緒に動作しない理由も教えてください。 –

+0

主な理由は、 'find'や' substr'を使うとスカラーだけで動作しますが、パンダでは配列が使われていると思います。したがって、 'str.find'や' str.startswith'のようなpandasのテキスト関数が必要です。 - [docs](http://pandas.pydata.org/pandas-docs/stable/text.html)を参照してください。いい日!そして私の解決策を受け入れることができます。ありがとうございました。 – jezrael

0

np.where("Smith" in df['name'],'Y','N')の挙動が生成何df['name']に依存 - 私はnumpyの配列のいくつかの並べ替えを前提としています。残りはnumpy

In [733]: x=np.array(['one','two','three']) 
In [734]: 'th' in x 
Out[734]: False 
In [744]: 'two' in np.array(['one','two','three']) 
Out[744]: True 

inは、リストや文字列の配列の両方のため、文字列全体のテストです。これは部分文字列のテストではありません。

np.charには、配列の要素に文字列関数を適用する一連の関数があります。これらはおおよそnp.array([x.fn() for x in arr])に相当します。

In [754]: x=np.array(['one','two','three']) 
In [755]: np.char.startswith(x,'t') 
Out[755]: array([False, True, True], dtype=bool) 
In [756]: np.where(np.char.startswith(x,'t'),'Y','N') 
Out[756]: 
array(['N', 'Y', 'Y'], 
     dtype='<U1') 

またはfindで:

In [760]: np.char.find(x,'wo') 
Out[760]: array([-1, 1, -1]) 

pandas.str方法は似た何かをするように見えます。データ系列の要素に文字列メソッドを適用する。

関連する問題