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?

Zhubarb
quelle
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
Amit Verma
quelle
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
53

Sie müssen es wie folgt zuweisen: -

df['id']= df['id'].astype(str)
Rishil Antony
quelle
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)
RocksNwaves
quelle
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]
manesioz
quelle
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
user3423349
quelle
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')
Shekhar Chander
quelle