2017-06-05 7 views
-1

Als ein Newb zu Python und Pandas, ich habe versucht:Pandas/numpy np.where (df ['x']. Str.contains ('y')) vs np.where ('y' in df ['x'])

df_rows = np.where('y' in df['x'])[0] 
for i in df_rows: 
    print df_rows.iloc[i] 

keine Zeilen zurückgegeben, aber

df_rows = np.where(df['x'].str.contains('y'))[0] 
for i in df_rows: 
    print df_rows.iloc[i] 

tat Arbeit und zurückgegebenen Zeilen enthalten 'y' in df['x'].

Was fehlt mir? Warum hat die erste Form versagt? (Python 2,7)

+0

im ersten, 'df [ 'x'] 'ist eine listenartige Sequenz und Sie suchen nach Einträgen, die genau '' y'' sind. In der zweiten vektorisiert 'df [' x ']. Str' stringartige Operationen für jedes Element in 'df [' x ']' –

Antwort

0

Dies sind verschiedene Operationen:

  • Die in Kontroll Suche, wenn ein Element zu 'y' gleich ist. (Hinweis: Für Series von str, die möglicherweise nicht einmal richtig funktionieren).

  • Die Methode .str.contains durchsucht die Zeichenfolgendarstellung jedes Elements, wenn es 'y' enthält.

Die erste kann True oder False nur zurückkehren (das ist, weil Pythons data model says so und erzwingt es). Die zweite Methode ist eine normale Methode und gibt eine Series zurück, die True oder False enthält (weil normale Methoden tun können, was sie wollen).

>>> import pandas as pd 
>>> s = pd.Series(['abc', 'def', 'ghi']) 
>>> s.str.contains('a') 
0  True 
1 False 
2 False 
dtype: bool 
>>> s.eq('a') # looking for an identical match 
0 False 
1 False 
2 False 
dtype: bool 
0

Pandas erfordert eine bestimmte Syntax, damit die Dinge funktionieren. Auf der Suche nach einem stry mit dem Operator in überprüft die Mitgliedschaft der Zeichenfolge y in einem Pandas Series.

>>> df = pd.DataFrame({'x': ['hiya', 'howdy', 'hello']}) 
>>> df 
     x 
0 hiya 
1 howdy 
2 hello 
>>> df_rows = np.where('y' in df['x'])[0] 
>>> df_rows 
array([], dtype=int64) 
>>> df_rows = np.where(df['x'].str.contains('y'))[0] 
>>> df_rows 
array([0, 1], dtype=int64) 

Versuchen Sie dies und merkt es gibt einen Bool statt drei (wie wir zuerst denken könnte, da es drei Elemente in der Serie sind):

>>> 'y' in df['x'] 
False 
>>> 'hiya' in df['x'] 
False 
>>> 'hiya' in df['x'].values 
True 

Sie immer an sich selbst denken müssen: " suche ich nach Artikeln in einer Serie oder suche ich innerhalb der Serie nach Strings? "

Für Elemente in einer Reihe, verwenden isin:

df['x'].isin(['hello']) 

Für Strings innerhalb eines Elements verwenden .str.{whatever} (oder .apply(lambda s: s)):

>>> df['x'].str.contains('y') 
0  True 
1  True 
2 False 
Name: x, dtype: bool 
>>> df['x'].apply(lambda s: 'y' in s) 
0  True 
1  True 
2 False 
Name: x, dtype: bool