2016-07-12 24 views
1

Mein Datenrahmen hat eine Spalte namens "a" und es kann "Apfel" und "Orange" enthalten. Was ich will ist, sie zu extrahieren, wenn sie existieren, ansonsten "andere" zu bezeichnen.Pandas Datenrahmen extrahieren Strings

Ich kann einfach über die Zeilen schleifen und sie extrahieren. Allerdings sah ich eine Verwendung von numpy.where() für ähnliche Zwecke, aber nur zwei Kategorien.

result = numpy.where(df['a'].str.contains('apple'), 'apple', 'others') 

Ist es möglich, sie hier für den Fall von drei Kategorien zu bewerben? Mit anderen Worten, result sollte Einträge von "Apfel", "Orange" oder "Andere" enthalten.

Gibt es einen besseren Weg als das einfache Looping?

Antwort

2

Verwendung str.extract mit fillna:

df = pd.DataFrame({'a': ['orange','apple','a']}) 
print (df) 
     a 
0 orange 
1 apple 
2  a 

df['new'] = df.a.str.extract('(orange|apple)', expand=False).fillna('others') 
print (df) 
     a  new 
0 orange orange 
1 apple apple 
2  a others 
+0

ich das Ergebnis wollen eine der drei Möglichkeiten zu sein: 'Apfel', 'Orange' oder ‚o ihrer. – nos

+0

Ich bearbeite Antwort, bitte überprüfen Sie es. – jezrael

3

einfach nach Artikeln suchen, die apple oder mango mit np.in1d sind ein boolean Maske, die dann mit np.where verwendet werden könnten, erstellen Rest als others von ihnen zu setzen. So hätten wir -

df['b'] = np.where(np.in1d(df.a,['apple','orange']),df.a,'others') 

Für Fälle, in denen Sie mit Streichern arbeiten könnte suchen, die diese Namen als Teil von größeren Strings haben, können Sie str.extract (gefangen diese Idee von @jezrael's solution, ich hoffe, das ist okay!) und np.where dann verwenden, wie so -

strings = df.a.str.extract('(orange|apple)') 
df['b'] = np.where(np.in1d(strings,['apple','orange']),strings,'others') 

Probelauf -

In [294]: df 
Out[294]: 
      a 
0 apple-shake 
1  orange 
2 apple-juice 
3  apple 
4  mango 
5  orange 
6  banana 

In [295]: strings = df.a.str.extract('(orange|apple)') 

In [296]: df['b'] = np.where(np.in1d(strings,['apple','orange']),strings,'others') 

In [297]: df 
Out[297]: 
      a  b 
0 apple-shake apple 
1  orange orange 
2 apple-juice apple 
3  apple apple 
4  mango others 
5  orange orange 
6  banana others