如何基于Pandas DataFrame生成指定格式的XML文件?
问题
我有如下结构的Pandas DataFrame(包含NaN、NaT空值):
Date Min Max C 01.01.2003 01.01.2003 Nan NaT 02.01.2003 Nan Nan NaT 03.01.2003 Nan Nan NaT 04.01.2003 Nan 04.01.2003 NaT 06.01.2003 06.01.2003 Nan NaT 07.01.2003 Nan Nan NaT 08.01.2003 Nan 08.01.1993 NaT 09.01.2003 Nan Nan 09.01.2003 14.01.2003 14.01.2003 Nan NaT 15.01.2003 Nan Nan NaT 16.01.2003 Nan 16.01.2003 NaT 29.01.2003 Nan Nan 29.01.2003
期望生成如下格式的XML文件:
<Or> <Date Source="test" test2="test3"> <Min>01.01.2003</Min> <Max>04.01.2003</Max> </Date> <Date Source="test" test2="test3"> <Min>06.01.2003</Min> <Max>08.01.2003</Max> </Date> <Date Source="test" test2="test3"> <Min>14.01.2003</Min> <Max>16.01.2003</Max> </Date> <Date Source="test" test2="test3"> 09.01.2003 29.01.2003 <Dates></Dates> </Date> </Or>
目前使用以下Python代码生成XML:
import pandas as pd import xml.etree.ElementTree as gfg # 假设这里有读取DataFrame的代码,比如df = pd.read_csv(...) data = gfg.Element("Or") for idx, row in data.iterrows(): element1 = gfg.SubElement(data, "Test") element2 = gfg.SubElement(data, "Test2") s_elem1 = gfg.SubElement(element1, 'Min') s_elem2 = gfg.SubElement(element1, 'Max') s_elem1.text=row['Min'] s_elem2.text=row['Max'] b_xml=gfg.tostring(data)
由于代码逐行遍历DataFrame,会生成包含空值的元素,无法实现将Min与对应Max配对、以及处理C列日期的需求,请问需如何修改代码以得到目标XML结构?
解决方案
要实现需求,需要先对DataFrame进行数据清洗和分组配对,再生成对应XML结构,步骤如下:
1. 预处理DataFrame
首先提取非空的Min、Max和C列数据,然后将相邻的Min和Max配对,同时收集C列的所有非空日期:
import pandas as pd import xml.etree.ElementTree as gfg # 构造或读取你的DataFrame df = pd.DataFrame({ 'Date': ['01.01.2003', '02.01.2003', '03.01.2003', '04.01.2003', '06.01.2003', '07.01.2003', '08.01.2003', '09.01.2003', '14.01.2003', '15.01.2003', '16.01.2003', '29.01.2003'], 'Min': ['01.01.2003', pd.NA, pd.NA, pd.NA, '06.01.2003', pd.NA, pd.NA, pd.NA, '14.01.2003', pd.NA, pd.NA, pd.NA], 'Max': [pd.NA, pd.NA, pd.NA, '04.01.2003', pd.NA, pd.NA, '08.01.1993', pd.NA, pd.NA, pd.NA, '16.01.2003', pd.NA], 'C': [pd.NaT, pd.NaT, pd.NaT, pd.NaT, pd.NaT, pd.NaT, pd.NaT, '09.01.2003', pd.NaT, pd.NaT, pd.NaT, '29.01.2003'] }) # 提取非空的Min和Max值并配对 min_dates = df[df['Min'].notna()]['Min'].tolist() max_dates = df[df['Max'].notna()]['Max'].tolist() min_max_pairs = list(zip(min_dates, max_dates)) # 提取C列非空日期 c_dates = df[df['C'].notna()]['C'].tolist()
2. 生成目标XML结构
根据配对好的数据和C列日期,构建符合要求的XML:
# 创建根节点 root = gfg.Element("Or") # 生成Min-Max对应的Date节点 for min_date, max_date in min_max_pairs: date_elem = gfg.SubElement(root, "Date", Source="test", test2="test3") min_elem = gfg.SubElement(date_elem, "Min") min_elem.text = min_date max_elem = gfg.SubElement(date_elem, "Max") max_elem.text = max_date # 生成C列日期对应的Date节点 if c_dates: c_date_elem = gfg.SubElement(root, "Date", Source="test", test2="test3") # 将C列日期拼接为文本内容 c_date_elem.text = ' '.join(c_dates) gfg.SubElement(c_date_elem, "Dates") # 格式化XML缩进(Python 3.9+支持) gfg.indent(root) # 转换为可读的XML字符串 xml_str = gfg.tostring(root, encoding='utf-8').decode('utf-8') print(xml_str)
关键说明
- 先过滤非空值提取有效数据,避免逐行遍历产生空元素;
- 用
zip将Min和Max一一配对(需确保两者数量对应,若有特殊配对逻辑可自行调整); - 单独处理C列非空日期,拼接后作为对应Date节点的文本内容;
gfg.indent用于美化XML结构,低版本Python可手动实现缩进逻辑。
内容的提问来源于stack exchange,提问作者beginner
相关产品推荐
相关产品推荐

