2016-05-31 15 views
2

ich Pandas Datenrahmen, die ich von Daten in einer XML-Datei gespeichert erstellt haben:Ändern der dtype für bestimmte Spalten in einer Pandas Datenrahmen

Zunächst wird die xlm Datei geöffnet wird und analysiert

xmlData = etree.parse(filename) 
trendData = xmlData.findall("//TrendData") 

I ein Verzeichnis erstellt, die alle Datennamen aufgelistet (die als Spaltennamen verwendet werden) als Schlüssel und gibt die Position der Daten in der xML-Datei:

Parameters = {"TreatmentUnit":("Worklist/AdminData/AdminValues/TreatmentUnit"), 
      "Modality":("Worklist/AdminData/AdminValues/Modality"), 
      "Energy":("Worklist/AdminData/AdminValues/Energy"), 
      "FieldSize":("Worklist/AdminData/AdminValues/Fieldsize"), 
      "SDD":("Worklist/AdminData/AdminValues/SDD"), 
      "Gantry":("Worklist/AdminData/AdminValues/Gantry"), 
      "Wedge":("Worklist/AdminData/AdminValues/Wedge"), 
      "MU":("Worklist/AdminData/AdminValues/MU"), 
      "My":("Worklist/AdminData/AdminValues/My"), 
      "AnalyzeParametersCAXMin":("Worklist/AdminData/AnalyzeParams/CAX/Min"), 
      "AnalyzeParametersCAXMax":("Worklist/AdminData/AnalyzeParams/CAX/Max"), 
      "AnalyzeParametersCAXTarget":("Worklist/AdminData/AnalyzeParams/CAX/Target"), 
      "AnalyzeParametersCAXNorm":("Worklist/AdminData/AnalyzeParams/CAX/Norm"), 
....} 

Dies ist nur ein kleiner Teil das Verzeichnis, die eigentliche eine Liste über 80 Parameter Die Verzeichnisschlüssel dann sortiert werden:

sortedKeys = list(sorted(Parameters.keys())) 

Ein Header für die Pandas Datenrahmen erstellt:

dateList=[] 
dateList.append('date') 
headers = dateList+sortedKeys 

ich dann eine leere Pandas Datenrahmen mit dem erstellen gleiche Anzahl von Zeilen wie die Anzahl der Datensätze in trendData und mit den Spaltenüberschriften auf "headers" und dann durch die Datei durch das Füllen des Datenrahmens:

df = pd.DataFrame(index=np.arange(0,len(trendData)), columns=headers) 
for a,b in enumerate(trendData): 
    result={} 
    result["date"] = dateutil.parser.parse(b.attrib['date']) 
    for i,j in enumerate(Parameters): 
     result[j] = b.findtext(Parameters[j]) 
     df.loc[a]=(result) 
df = df.set_index('date') 

Dies scheint gut zu funktionieren, aber das Problem ist, dass der dtyp für jede Spalte auf 'Objekt' gesetzt ist, während die meisten Ganzzahlen sein sollten. Es ist möglich zu verwenden:

und es funktioniert gut, aber jetzt ist entzogen. Ich kann auch verwendet werden, zum Beispiel:

df.AnalyzeParametersBQFMax = pd.to_numeric(df.AnalyzeParametersBQFMax) 

auf einzelne Spalten zu konvertieren. Aber gibt es eine Möglichkeit, pd.to_numeric mit einer Liste von Spaltennamen zu verwenden. Ich kann eine Liste von Spalten erstellen, die ganzzahlig sein sollten.

int64list=[] 
for q in sortedKeys: 
    if q.startswith("AnalyzeParameters"): 
     int64list.append(q) 

aber kann keine Möglichkeit finden, diese Liste an die Funktion zu übergeben.

Antwort

3

Sie können Spalten in einem DataFrame explizit durch die gleiche Spalte nur mit einer anderen dtype ersetzen. Versuchen Sie folgendes:

import pandas as pd 
data = pd.DataFrame({'date':[2000, 2001, 2002, 2003], 'type':['A', 'B', 'A', 'C']}) 
data['date'] = data['date'].astype('int64') 

wenn jetzt data.dtypes nannte es die folgenden zurückgeben sollte:

date  int64 
type object 
dtype: object 

für mehrere Spalten einer for-Schleife verwenden, um durch die int64list Sie in Ihrer Frage erwähnt auszuführen.

+0

Dank. Es funktionierte gut, obwohl ich verwenden musste: daten ['datum'] = daten ['datum']. Astype ('float') lieber als int64 aus irgendeinem grund – Trigfa

+0

Froh, ich könnte helfen! –

1

für mehrere Spalten können Sie es auf diese Weise tun:

cols = df.filter(like='AnalyzeParameters').columns.tolist() 
df[cols] = df[cols].astype(np.int64) 
Verwandte Themen