Konvertieren einer Spalte innerhalb des Pandas-Datenrahmens von int in string

104

Ich habe einen Datenrahmen in Pandas mit gemischten int- und str-Datenspalten. Ich möchte zuerst die Spalten innerhalb des Datenrahmens verketten. Dazu muss ich eine intSpalte in konvertierenstr . Ich habe versucht, Folgendes zu tun:

mtrx['X.3'] = mtrx.to_string(columns = ['X.3'])

oder

mtrx['X.3'] = mtrx['X.3'].astype(str)

In beiden Fällen funktioniert es jedoch nicht und es wird die Fehlermeldung angezeigt, dass "str" ​​- und "int" -Objekte nicht verkettet werden können. Das Verketten von zwei strSpalten funktioniert einwandfrei.

Malfet
quelle

Antworten:

136
In [16]: df = DataFrame(np.arange(10).reshape(5,2),columns=list('AB'))

In [17]: df
Out[17]: 
   A  B
0  0  1
1  2  3
2  4  5
3  6  7
4  8  9

In [18]: df.dtypes
Out[18]: 
A    int64
B    int64
dtype: object

Konvertieren Sie eine Serie

In [19]: df['A'].apply(str)
Out[19]: 
0    0
1    2
2    4
3    6
4    8
Name: A, dtype: object

In [20]: df['A'].apply(str)[0]
Out[20]: '0'

Vergessen Sie nicht, das Ergebnis zurückzugeben:

df['A'] = df['A'].apply(str)

Konvertieren Sie den gesamten Frame

In [21]: df.applymap(str)
Out[21]: 
   A  B
0  0  1
1  2  3
2  4  5
3  6  7
4  8  9

In [22]: df.applymap(str).iloc[0,0]
Out[22]: '0'

df = df.applymap(str)
Jeff
quelle
3
Ich verstehe wirklich nicht warum, aber mtrx ['X.3']. Apply (str) funktioniert auch nicht für mich :( dtype zeigt immer noch int64 an. Der Datenrahmen für 23177 Zeile und X.3 Spalte hat nur Zahlen [21]: mtrx ['X.3']. Dtype Out [21]: dtype ('int64')
Malfet
0.7.0, kommen mit Python 2.7 auf Ubuntu-System
Malfet
aktuelle Version ist 0.12, sollten Sie aktualisieren.
Jeff
df ['A']. apply (str) funktioniert nicht. aber df.column_name = df.column_name.astype (str) funktioniert. Keine Ahnung warum.
Dmitry Konovalov
1
@DmitryKonovalov in Python-Strings sind unveränderlich. Wenn Sie also die Daten bearbeiten, müssen Sie das Ergebnis wieder in die Variable einfügen.
Sriram Arvind Lakshmanakumar
90

Ändern Sie den Datentyp der DataFrame-Spalte:

Zu int:

df.column_name = df.column_name.astype(np.int64)

Zu str:

df.column_name = df.column_name.astype(str)

Tanaque
quelle
7
Dies ist ansprechend, aber es ist ungefähr 4x langsamer als apply(str)von @Jeff, in meinem Test mit pd.Series(np.arange(1000000)).
John Zwinck
2
Das funktioniert bei mir. df['A'] = df['A'].apply(str)funktioniert auch. Die Antwort von @Jeff funktioniert bei mir nicht.
Tommy.carstensen
1
In Bezug auf @ JohnZwinck Kommentar, mit Python3 scheint es so schnell mehr wie 2x zu bedienen apply()statt astype(): timeit.Timer ( 'c.apply (str)' Setup = 'Import Pandas als pd; c = pd.Series (Bereich ( 1000)) '). Timeit (1000) >>> 0.41499893204309046 >>> timeit.Timer (' c.astype (str) ', setup =' Pandas als pd importieren; c = pd.Series (range (1000)) ' ) .timeit (1000) 0.8004439630312845
hamx0r
15

Warnung : Beide Lösungen angegeben ( astype () und apply () ) behalten weder in der nan- noch in der None-Form NULL-Werte bei.

import pandas as pd
import numpy as np

df = pd.DataFrame([None,'string',np.nan,42], index=[0,1,2,3], columns=['A'])

df1 = df['A'].astype(str)
df2 =  df['A'].apply(str)

print df.isnull()
print df1.isnull()
print df2.isnull()

Ich glaube, dies wird durch die Implementierung von to_string () behoben

Keith
quelle
1
Mit to_string können Sie die Behandlung von Nan auswählen, z. B. um eine leere Zeichenfolge anstelle von 'Nan' zurückzugeben
seanv507
1
(Ich war nicht anderer Meinung, nur um das zu erweitern, was Sie gesagt haben) - wollte +1 sagen
seanv507
8

Verwenden Sie den folgenden Code:

df.column_name = df.column_name.astype('str')
Faraz Ramtin
quelle
0

Nur als zusätzliche Referenz.

Alle oben genannten Antworten funktionieren im Falle eines Datenrahmens. Wenn Sie jedoch beim Erstellen / Ändern einer Spalte Lambda verwenden, funktioniert dies nicht, da es dort als int-Attribut anstelle von Pandas-Reihen betrachtet wird. Sie müssen str (target_attribute) verwenden, um es als Zeichenfolge zu erstellen. Bitte beziehen Sie sich auf das folgende Beispiel.

def add_zero_in_prefix(df):
    if(df['Hour']<10):
        return '0' + str(df['Hour'])

data['str_hr'] = data.apply(add_zero_in_prefix, axis=1)
Sujithramanathan
quelle