Ich benutze Pandas 'Version 0.12.0' mit Python 2.7 und habe einen Datenrahmen wie folgt:
df = pd.DataFrame({'id' : [123,512,'zhub1', 12354.3, 129, 753, 295, 610],
'colour': ['black', 'white','white','white',
'black', 'black', 'white', 'white'],
'shape': ['round', 'triangular', 'triangular','triangular','square',
'triangular','round','triangular']
}, columns= ['id','colour', 'shape'])
Die id
Serie besteht aus einigen Ganzzahlen und Zeichenfolgen. Es ist dtype
standardmäßig object
. Ich möchte den gesamten Inhalt von id
in Strings konvertieren . Ich habe es versucht astype(str)
, was die Ausgabe unten erzeugt.
df['id'].astype(str)
0 1
1 5
2 z
3 1
4 1
5 7
6 2
7 6
1) Wie kann ich alle Elemente von id
in String konvertieren ?
2) Ich werde schließlich id
für die Indizierung für Datenrahmen verwenden. Würden String-Indizes in einem Datenrahmen die Dinge verlangsamen, verglichen mit einem Integer-Index?
astype
für mich gut funktioniert, zumindest in Version 0.13.1, vielleicht hat 0.12.0 einen Fehler? Als Antwort auf Ihren zweiten Punkt ist es wahrscheinlich langsamer, da der Zeichenfolgenvergleich nicht schneller als der Ganzzahlvergleich ist, aber ich würde dies zuerst profilieren, es hängt auch von der Größe abdf['id'].astype(str)
Antworten:
Sie können alle Elemente von id in
str
using konvertierenapply
df.id.apply(str) 0 123 1 512 2 zhub1 3 12354.3 4 129 5 753 6 295 7 610
Bearbeiten von OP:
Ich denke, das Problem hing mit der Python-Version (2.7.) Zusammen. Dies funktionierte:
df['id'].astype(basestring) 0 123 1 512 2 zhub1 3 12354.3 4 129 5 753 6 295 7 610 Name: id, dtype: object
quelle
astype(str )
nicht funktioniert?df['id'].astype(str)
df.id.apply(str)
(gewünscht)?.astype('str')
statt sein.astype(str)
.astype('str')
Sie müssen es wie folgt zuweisen: -
df['id']= df['id'].astype(str)
quelle
Eine neue Antwort, die die aktuellsten Praktiken widerspiegelt: Ab Version 1.0.1 funktioniert weder
astype('str')
nochastype(str)
.Gemäß der Dokumentation kann eine Serie auf folgende Weise in den Zeichenfolgendatentyp konvertiert werden:
df['id'] = df['id'].astype("string") df['id'] = pandas.Series(df['id'], dtype="string") df['id'] = pandas.Series(df['id'], dtype=pandas.StringDtype)
quelle
Persönlich hat keines der oben genannten für mich funktioniert. Was hat getan:
new_str = [str(x) for x in old_obj][0]
quelle
Sie können verwenden:
df.loc[:,'id'] = df.loc[:, 'id'].astype(str)
Aus diesem Grund empfehlen sie diese Lösung: Pandas doc
TD; LR
Um einige der Antworten zu reflektieren:
df['id'] = df['id'].astype("string")
Dies wird im angegebenen Beispiel unterbrochen, da versucht wird, in StringArray zu konvertieren, das keine Zahl in der Zeichenfolge verarbeiten kann.
df['id']= df['id'].astype(str)
Für mich warnt diese Lösung:
> SettingWithCopyWarning: > A value is trying to be set on a copy of a > slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead
quelle
Ihr Problem kann leicht gelöst werden, indem Sie es zuerst in das Objekt konvertieren. Nachdem es in ein Objekt konvertiert wurde, verwenden Sie einfach "astype", um es in str zu konvertieren.
obj = lambda x:x[1:] df['id']=df['id'].apply(obj).astype('str')
quelle
Bei mir hat es geklappt:
df['id'].convert_dtypes()
Siehe die Dokumentation hier:
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.convert_dtypes.html
quelle