Pandas: Ändern Sie den Datentyp der Serie in String


74

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 idSerie besteht aus einigen Ganzzahlen und Zeichenfolgen. Es ist dtypestandardmäßig object. Ich möchte den gesamten Inhalt von idin 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 idin String konvertieren ?

2) Ich werde schließlich idfür die Indizierung für Datenrahmen verwenden. Würden String-Indizes in einem Datenrahmen die Dinge verlangsamen, verglichen mit einem Integer-Index?


1
Sie sind sich nicht sicher, warum Sie diese Ausgabe erhalten, da sie astypefü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 ab
EdChum

Sie haben die Spalte gesetzt, richtig? df ['id'] = df ['id']. astype (str)
Andy Hayden

@Andy Hayden, ja, ich mache den Termin, aber es ist die Ausgabe, die ich für unerwartet hielt.
Zhubarb

auf welche Weise unerwartet?
Andy Hayden

1
Es gibt nur das 1. Zeichen jedes df['id'].astype(str)
Serienelements zurück,

Antworten:


97

Sie können alle Elemente von id in strusing 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

2
Vielen Dank, ich werde es versuchen, wenn ich mich neben einem Computer befinde und Ihre Antwort akzeptiere. Weißt du warum astype(str )nicht funktioniert?
Zhubarb

@ Zhubarb - Ich habe es gerade versucht, ich bekomme das gleiche Ergebnis mitdf['id'].astype(str)
Amit Verma

das gleiche Ergebnis, das ich gepostet habe (unerwünscht) oder das Ergebnis, das Sie erhalten haben df.id.apply(str)(gewünscht)?
Zhubarb

3
Ich glaube, es sollte .astype('str')statt sein.astype(str)
Alex Klibisz

2
@ErnestSKirubakaran - Lesen Sie den vorherigen Kommentar, versuchen Sie es mit.astype('str')
Amit Verma


27

Eine neue Antwort, die die aktuellsten Praktiken widerspiegelt: Ab Version 1.0.1 funktioniert weder astype('str')noch astype(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)

4

Persönlich hat keines der oben genannten für mich funktioniert. Was hat getan:

new_str = [str(x) for x in old_obj][0]

1

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

1

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')

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.