2016-11-21 69 views
2

關於使用numpy的地方有什麼問題。我可以使用==運算符的條件,但不能在where條件中使用「是另一個字符串的一個字符串子字符串?」Python numpy哪裏的功能行爲

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,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 

如果想使用in與標量需要apply工作:

該解決方案是更快,但如果NaNname不起作用。

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函數中的字符串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方法似乎做同樣的事情;將字符串方法應用於數據系列的元素。