2016-05-03 2 views
2

Gibt es eine Möglichkeit, neue Werte auf einer Datenrahmenspalte basierend auf dem ersten Zeichen der aktuellen Werte abzubilden.Pandas: neue Werte basierend auf dem ersten Zeichen abbilden

Mein aktueller Code:

ncesvars['urbantype'] = np.where(ncesvars['urbantype'].str.startswith('1'), 'city', ncesvars['urbantype']) 
ncesvars['urbantype'] = np.where(ncesvars['urbantype'].str.startswith('2'), 'suburban', ncesvars['urbantype']) 
ncesvars['urbantype'] = np.where(ncesvars['urbantype'].str.startswith('3'), 'town', ncesvars['urbantype']) 
ncesvars['urbantype'] = np.where(ncesvars['urbantype'].str.startswith('4'), 'rural', ncesvars['urbantype']) 

Ich dachte an eine Art von dict und anschließend pd.replace, war aber nicht sicher, wie das zu tun mit .str.startswith()

Antwort

2

Sie können eine dict Ihrer Kategorien definieren, verwenden str[0:1] die Daten in Scheiben schneiden und durch Testen map auf einer boolean-Maske Ihres Series nennen, ob das erste Zeichen der Daten in Ihrem dict Schlüssel ist, so dass nur sonst überschrieben werden passt Sie Überschreiben mit NaN wie es im folgende Beispiel keine Abbildung für die letzte Zeile ist:

In [16]: 
df = pd.DataFrame({'urbantype':['1 asdas','2 asd','3 asds','4 asdssd','5 asdas']}) 
df 

Out[16]: 
    urbantype 
0 1 asdas 
1  2 asd 
2 3 asds 
3 4 asdssd 
4 5 asdas 

In [18]: 
d = {'1':'city','2':'suburban', '3': 'town','4':'rural'} 
df.loc[df['urbantype'].str[0:1].isin(d.keys()), 'urbantype'] = df['urbantype'].str[0:1].map(d) 
df 

Out[18]: 
    urbantype 
0  city 
1 suburban 
2  town 
3  rural 
4 5 asdas 
+0

danke für die Eingabe. ist der 'df.loc' Teil wichtig, verglichen mit @ ayhans Antwort? – As3adTintin

+1

Ja, weil Sie nur die Zeilen beeinflussen möchten, in denen die Daten Ihren dict Schlüsseln entsprechen, andernfalls überschreiben Sie diese Zeile mit 'NaN' deshalb ist die letzte Reihe unverändert – EdChum

+0

ahhh ok danke! – As3adTintin

3

versuchen etwas Ähnliches wie:

ncesvars['urbantype'] = ncesvars['urbantype'].replace({ 
    r'^1.*', 'city', 
    r'^2.*', 'suburban'}, 
    regex=True) 

Test:

In [32]: w 
Out[32]: 
    word 
0 1_A_ 
1 word03 
2 word02 
3 word00 
4 2xxx 
5 word04 
6 word01 
7 word02 
8 word04 
9 3aaa 

In [33]: w['word'].replace({r'^1.*': 'city', r'^2.*': 'suburban', r'^3.*': 'town'}, regex=True) 
Out[33]: 
0  city 
1  word03 
2  word02 
3  word00 
4 suburban 
5  word04 
6  word01 
7  word02 
8  word04 
9  town 
Name: word, dtype: object 
+0

dank für die Eingabe. Ich erhalte das erorr 'replace() hat ein unerwartetes Schlüsselwortargument 'regex' bekommen und wenn ich es ohne das' regex' Argument versuche, erhalte ich den Fehler 'replace() benötigt mindestens 3 Argumente (2 gegeben)' – As3adTintin

+0

funktioniert nicht für mich entweder, ich empfange die ursprünglichen Werte – As3adTintin

+0

@ As3adTintin, ich habe einen Testfall hinzugefügt – MaxU