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.