Konvertieren Sie Spalten in Zeichenfolgen in Pandas

177

Ich habe den folgenden DataFrame aus einer SQL-Abfrage:

(Pdb) pp total_rows
     ColumnID  RespondentCount
0          -1                2
1  3030096843                1
2  3030096845                1

und ich möchte es so drehen:

total_data = total_rows.pivot_table(cols=['ColumnID'])

(Pdb) pp total_data
ColumnID         -1            3030096843   3030096845
RespondentCount            2            1            1

[1 rows x 3 columns]


total_rows.pivot_table(cols=['ColumnID']).to_dict('records')[0]

{3030096843: 1, 3030096845: 1, -1: 2}

Ich möchte jedoch sicherstellen, dass die 303 Spalten als Zeichenfolgen anstelle von Ganzzahlen umgewandelt werden, damit ich Folgendes erhalte:

{'3030096843': 1, '3030096845': 1, -1: 2}
sontek
quelle

Antworten:

330

Eine Möglichkeit zur Konvertierung in einen String ist die Verwendung von Astype :

total_rows['ColumnID'] = total_rows['ColumnID'].astype(str)

Vielleicht suchen Sie jedoch nach der to_jsonFunktion, mit der Schlüssel in gültigen JSON (und damit Ihre Schlüssel in Zeichenfolgen) konvertiert werden:

In [11]: df = pd.DataFrame([['A', 2], ['A', 4], ['B', 6]])

In [12]: df.to_json()
Out[12]: '{"0":{"0":"A","1":"A","2":"B"},"1":{"0":2,"1":4,"2":6}}'

In [13]: df[0].to_json()
Out[13]: '{"0":"A","1":"A","2":"B"}'

Hinweis: Sie können einen Puffer / eine Datei übergeben, um diese zusammen mit einigen anderen Optionen zu speichern ...

Andy Hayden
quelle
3
Ich denke, to_string () ist aufgrund der Beibehaltung von NULL- Werten
Keith
1
@ Keith Null Erhaltung ist attraktiv. Das Dokument gibt jedoch an, dass der Zweck darin besteht, einen DataFrame in eine konsolenfreundliche tabellarische Ausgabe zu rendern. Ich möchte, dass jemand maßgeblich wiegt
3pitt
to_json()wird wahrscheinlich nicht aufgerufen, astype(str)da datetime64 und seine Unterklassen seit der Epoche als Millisekunden verlassen werden.
Sussch
1
@Sussch Ich vermute, das liegt daran, dass json kein explizites Datum / Uhrzeit-Format hat, also bist du gezwungen, Epoche zu verwenden. Das heißt, ich denke, das ist der Standard.
Andy Hayden
48

Wenn Sie ALLE Spalten in Zeichenfolgen konvertieren müssen, können Sie einfach Folgendes verwenden:

df = df.astype(str)

Dies ist nützlich, wenn Sie alles außer ein paar Spalten als Zeichenfolgen / Objekte benötigen. Gehen Sie dann zurück und konvertieren Sie die anderen in das, was Sie benötigen (in diesem Fall Ganzzahl):

 df[["D", "E"]] = df[["D", "E"]].astype(int) 
Mike
quelle
28

Hier ist die andere, die besonders nützlich ist, um mehrere Spalten in Zeichenfolgen anstatt nur in einzelne Spalten zu konvertieren :

In [76]: import numpy as np
In [77]: import pandas as pd
In [78]: df = pd.DataFrame({
    ...:     'A': [20, 30.0, np.nan],
    ...:     'B': ["a45a", "a3", "b1"],
    ...:     'C': [10, 5, np.nan]})
    ...: 

In [79]: df.dtypes ## Current datatype
Out[79]: 
A    float64
B     object
C    float64
dtype: object

## Multiple columns string conversion
In [80]: df[["A", "C"]] = df[["A", "C"]].astype(str) 

In [81]: df.dtypes ## Updated datatype after string conversion
Out[81]: 
A    object
B    object
C    object
dtype: object
Surya
quelle
3

Verwenden Sie .astype (str)

Ex:

Sei d der Pandas DataFrame

d['Column_name'].astype(str)

Kranthi Kumar Valaboju
quelle
0

Die Verwendung .apply()mit einer lambdaKonvertierungsfunktion funktioniert auch in diesem Fall:

total_rows['ColumnID'] = total_rows['ColumnID'].apply(lambda x: str(x))

Für ganze Datenrahmen können Sie verwenden .applymap(). (aber auf jeden Fall ist wahrscheinlich .astype()schneller)

dbouz
quelle