2016-05-09 14 views
0

Ich finde diese scheinbar einfache Operation ziemlich hart. Ich habe einen Datenrahmen, der eine Spalte hat, die CompanyId genannt wird. Seine Werte sind 'COMP23', 'COMP55', .. etc. Jetzt, wenn ich das Präfix 'COMP' entfernen und es numerisch machen will, schlägt es mich. Dies ist, was ich tue:Ändern des Textes einer Spalte in einem Pandas Datenrahmen

df['companyId'] = df['companyId'].astype('str') # because type was 'object'. 

df['companyId'].map(lambda x: int(x[4:])) 

Wo liege ich falsch? Ich bemerkte, dass das df ein Serienobjekt war.

Antwort

2

Versuchen:

df['companyId'] = df['companyId'].map(lambda x: int(str(x)[4:])) 
0

Sie können ein Regex-Muster verwenden, um alle Ziffern (\d+) zu extrahieren.

>>> df.CompanyId.str.extract(r'(\d+)') 
0 23 
1 55 
Name: CompanyId, dtype: object 

Beachten Sie, dass Ihre ursprüngliche Methode einwandfrei funktioniert.

>>> df['CompanyId'].astype('str').map(lambda x: int(x[4:])) 
0 23 
1 55 
Name: CompanyId, dtype: int64 

Wenn ein Fehler vorliegt, liegt dies möglicherweise daran, dass ein Problem mit den Daten vorliegt.

df = pd.DataFrame({'CompanyId': ['COMP23', 'COMP55', 'COMP', '', 'COM55']})  
df['CompanyId'].astype('str').map(lambda x: int(x[4:])) 

ValueError: invalid literal for int() with base 10: ''

Beachten Sie, dass die RegexMuster noch die richtigen Werte extrahiert:

>>> df.CompanyId.str.extract(r'(\d+)') 
0  23 
1  55 
2 NaN 
3 NaN 
4  55 
0

versuchen Sie dies:

In [210]: df['companyId'].str.replace('COMP','').astype(int) 
Out[210]: 
0  23 
1  55 
2 101 
Name: companyId, dtype: int32 

oder

In [207]: df.companyId.str[4:].astype(int) 
Out[207]: 
0  23 
1  55 
2 101 
Name: companyId, dtype: int32 
Verwandte Themen