2016-11-21 1 views
2

numpy의 where 조건 사용에 관한 질문이 있습니다. 나는 == 연산자를 사용하여 where 조건을 사용할 수 있지만 "다른 문자열의 한 문자열 부분 문자열입니까?"라는 조건을 사용할 수 없습니다.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 

출력 :

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

은 당신이 부울 마스크 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를 사용하려면 다음이 솔루션은 빠른

, 하지만 열 에 NaN 인 경우 작동하지 않습니다.

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'와 같은 팬더 텍스트 기능이 필요합니다 - [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 방법은 비슷한 할 것으로 보인다; 데이터 시리즈의 요소에 문자열 메서드를 적용합니다.