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}

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 ...


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) 

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


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)

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.