2015-09-15 7 views
21

Ich importiere eine Excel-Datei in einen Pandas-Datenrahmen mit der pandas.read_excel()-Funktion.Python Pandas: wie Datentypen beim Lesen einer Excel-Datei angeben?

Eine der Spalten ist der Primärschlüssel der Tabelle: Es sind alle Zahlen, aber es wird als Text gespeichert (das kleine grüne Dreieck oben links in den Excel-Zellen bestätigt dies).

Wenn ich jedoch die Datei in einen Pandas-Dataframe importiere, wird die Spalte als Float importiert. Beispiel: '0614' wird zu 614.

Gibt es eine Möglichkeit, den Datentyp beim Importieren einer Spalte anzugeben? Ich verstehe, dass dies beim Importieren von CSV-Dateien möglich ist, aber nichts in der Syntax von read_excel() finden konnte. Die einzige Lösung, die ich mir vorstellen kann, besteht darin, einen willkürlichen Buchstaben am Anfang des Textes (Umwandlung von '0614' in 'A0614') in Excel einzufügen, um sicherzustellen, dass die Spalte als Text importiert und dann abgehackt wird das 'A' in Python, damit ich es mit anderen Tabellen vergleichen kann, die ich aus SQL importiere.

Antwort

39

Sie geben nur Konverter an. Ich erstellte eine Excel-Tabelle der folgenden Struktur:

Wo die Spalte "Alter" als Zeichenfolgen formatiert ist. Zum Laden:

import pandas as pd 

df = pd.read_excel('Book1.xlsx',sheetname='Sheet1',header=0,converters={'names':str,'ages':str}) 
>>> df 
     names ages 
    0 bob 05 
    1 tom 4 
    2 suzy 3 
+0

Ich hatte verstanden "Konverter" eine Funktion für die Spalte angegeben. Offensichtlich lag ich falsch - danke, dass du es aufgezeigt hast, es ist sehr nützlich! –

+1

Wo finde ich die Liste der zulässigen Konverterfunktionen? Ich sehe 'str' hier, aber vermutlich gibt es' int' und ein paar mehr - gibt es einen Link irgendwo zu den Quelldokumenten, die die möglichen Konverterfunktionen auflistet? –

+1

Ich habe auch keine Liste gefunden. Da "Konverter" Funktionen annehmen, vermute ich, dass Ihre Vorstellungskraft die Grenze ist, nur damit Sie innerhalb der Grenzen der "Konverter" -Funktionalität bleiben (d. H. Sie wurde entwickelt, um Funktionen zu verwenden, die nur eine Eingabevariable benötigen!). – tnknepp

8

Die Funktion read_excel() hat ein Konverter-Argument, in dem Sie Funktionen zur Eingabe in bestimmte Spalten anwenden können. Sie können dies verwenden, um sie als Zeichenfolgen zu behalten. Documentation:

Dict von Funktionen für die Werte in bestimmten Spalten zu konvertieren. Schlüssel können Ganzzahlen oder Spaltenbeschriftungen sein, Werte sind Funktionen, die ein Eingabeargument, den Excel-Zelleninhalt, enthalten und den transformierten Inhalt zurückgeben.

Beispielcode:

pandas.read_excel(my_file, converters = {my_str_column: str}) 
+0

Wenn wir nicht wissen, wie viele Spalten im Blatt vorhanden sind, gibt es eine Möglichkeit, sie beim Lesen auf jede Spalte anzuwenden? – Tango

+6

Lösung: 'converters = {col: str für col in column_list} df = pd.read_excel ('some_excelfile.xls', Konverter = Konverter)' – Tango

6

mit v0.20.0 starten, das dtype Schlüsselwort-Argument in read_excel() Funktion verwendet werden, um die Datentypen festlegen, die nur auf die Spalten angewendet werden muss, wie es für read_csv() Fall liegt vor, .

Mit converters und dtype Argumente zusammen auf den gleichen Spaltennamen würde dazu führen, dass die letzteren beschattet und ersteren gewinnt Präferenz.


1) Inorder für sie nicht die dtypes zu interpretieren, sondern passieren alle Inhalte davon Spalten ist, wie sie vor dem ursprünglich in der Datei waren, haben wir diese arg zu str oder object so einstellen könnte, dass wir nicht vermasseln unsere Daten. (Ein solcher Fall würde Nullen in Zahlen führt, die sonst verloren gehen würde)

pd.read_excel('file_name.xlsx', dtype=str)   # (or) dtype=object 

2) Es unterstützt auch eine dict Mapping wobei die keys die Spaltennamen dar und values es jeweiligen Datentyp speziell festgelegt werden, wenn Sie möchte die dtype für eine Teilmenge aller Spalten ändern.

# Assuming data types for `a` and `b` columns to be altered 
pd.read_excel('file_name.xlsx', dtype={'a': np.float64, 'b': np.int32}) 
+0

'read_excel' Methode akzeptiert' dtype' Parameter nicht. –

1

Im Fall, wenn Sie nicht bewusst sind, die Anzahl und Namen der Spalten in Datenrahmen dann kann diese Methode praktisch sein:

column_list = [] 
df_column = pd.read_excel(file_name, 'Sheet1').columns 
for i in df_column: 
    column_list.append(i) 
converter = {col: str for col in column_list} 
df_actual = pd.read_excel(file_name, converters=converter) 

wo column_list die Liste der Spaltennamen ist.

Verwandte Themen