2016-05-31 71 views
2

我有我已經從存儲在XML文件中的數據創建的熊貓數據幀:更改爲特定的列的D型細胞在大熊貓數據幀

最初XLM文件被打開和解析

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

我創建一個目錄列出所有數據的名稱(用作列名)作爲鍵並給出了在XML文件中的數據的位置:

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"), 
....} 

這只是一小部分的目錄,實際一個列表80個參數 目錄密鑰然後排序:

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

甲頭的熊貓數據幀創建的:

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

我然後創建具有一個空的熊貓數據幀與trendData中的記錄數相同的行數並且列標題設置爲'標題',然後通過填充數據幀的文件循環:

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') 

這似乎工作正常,但問題是,每個colum的dtype設置爲'對象',而大多數應該是整數。它可以使用:

df.convert_objects(convert_numeric=True) 

它工作正常,但現在被depricated。 我也可以使用,例如:

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

轉換單個列。但有沒有一種使用pd.to_numeric與列名列表的方式。我可以創建一個列應該是整數使用以下列表;

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

但無法找到一種方法將此列表傳遞給函數。

回答

3

您可以明確地用另一個dtype替換DataFrame中的列。 試試這個:

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

當現在呼籲data.dtypes它應該返回如下:

date  int64 
type object 
dtype: object 

的多個列使用for循環,你在你的問題中提到的int64list運行。

+0

感謝。它運作良好,雖然我不得不使用: data ['date'] = data ['date']。astype('float') 而不是int64由於某種原因 – Trigfa

+0

很高興我能幫忙! –

1

的多個列,你可以這樣來做:

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