我有一个pandas数据框,我是根据存储在xml文件中的数据创建的:
最初打开并解析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()))
为pandas dataframe创建标头:
dateList=[]
dateList.append('date')
headers = dateList+sortedKeys
然后我创建一个空的pandas数据帧,其行数与trendData中的记录数相同,列标题设置为“headers”,然后遍历填充数据帧的文件:
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')
这似乎工作正常,但问题是每个列的dtype设置为'object',而大多数应该是整数。可以使用:
df.convert_objects(convert_numeric=True)
它工作正常,但现在已被删除。 我也可以使用,例如:
df.AnalyzeParametersBQFMax = pd.to_numeric(df.AnalyzeParametersBQFMax)
转换单个列。但有没有一种方法可以将pd.to_numeric与列名列表一起使用。我可以使用以下内容创建一个列为整数的列表;
int64list=[]
for q in sortedKeys:
if q.startswith("AnalyzeParameters"):
int64list.append(q)
但无法找到将此列表传递给函数的方法。
答案 0 :(得分:5)
您可以使用另一个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
。
答案 1 :(得分:1)
对于多列,您可以这样做:
cols = df.filter(like='AnalyzeParameters').columns.tolist()
df[cols] = df[cols].astype(np.int64)