The to_xml
方法允许您将 DataFrame 转换为 XML 格式。
在本教程中,我们将逐步完成导出Pandas使用 DataFrame 到 XML 文件to_xml
method.
Pandas to_xml 语法
基本语法为to_xml
方法如下:
DataFrame.to_xml(path_or_buffer=None, root_name="data", row_name="row", na_rep="nan", attr_cols=None, elem_cols=None, attrs_prefix='@', elems_prefix='_', header=True, index=True, root_attrs=None, encoding=None, xml_declaration=True, pretty_print=True, processor=None, **kwargs)
以下是该方法的一些常用参数:
-
路径或缓冲区:目标文件或可写缓冲区。如果未提供,结果将以字符串形式返回。
-
根名称:根元素的名称。默认为“数据”。
-
row_name:行元素的名称。默认为“行”。
-
na_rep:缺失值的表示。默认为“nan”。
-
属性列:要序列化为行元素中的属性的列。
-
元素列:要序列化为子元素的列。
-
属性前缀:为每个行属性添加的前缀。默认为“@”。
-
元素前缀:为每行子元素添加的前缀。默认为“_”。
-
header:是否在输出中包含标题。默认为 True。
-
index:是否在输出中包含索引。默认为 True。
-
根属性:包含根元素属性的字典。
-
encoding:输出文件的字符编码。例如,“utf-8”。
-
xml_声明:是否在文件开头包含XML声明。默认为 True。
-
漂亮的打印:嵌套元素是否包含缩进。默认为 True。
指定文件路径或缓冲区
The path_or_buffer
中的参数to_xml
方法定义了结果 XML 内容的写入位置。您有两个主要选择:
- 指定保存 XML 数据的文件路径。
- 使用缓冲区(如 StringIO)捕获 XML 内容以进行进一步处理。
让我们探讨一下这两种情况。
导出到文件
import pandas as pd
df = pd.DataFrame({
'Name': ['Alice', 'Bob'],
'Age': [25, 30],
'Occupation': ['Engineer', 'Doctor']
})
df.to_xml("sample_data.xml")
如果你检查当前目录,你会发现一个名为sample_data.xml
。它包含了:
<?xml version='1.0' encoding='utf-8'?>
<data>
<row index="0">
<Name>Alice</Name>
<Age>25</Age>
<Occupation>Engineer</Occupation>
</row>
<row index="1">
<Name>Bob</Name>
<Age>30</Age>
<Occupation>Doctor</Occupation>
</row>
</data>
写入缓冲区
from io import BytesIO
buffer = BytesIO()
df.to_xml(buffer)
buffer.seek(0) # Reset buffer position to the beginning
xml_content = buffer.read().decode('utf-8')
print(xml_content)
Output:
<?xml version='1.0' encoding='utf-8'?>
<data>
<row index="0">
<Name>Alice</Name>
<Age>25</Age>
<Occupation>Engineer</Occupation>
</row>
<row index="1">
<Name>Bob</Name>
<Age>30</Age>
<Occupation>Doctor</Occupation>
</row>
</data>
在这种情况下,我们利用StringIO
用于捕获 XML 内容的缓冲区。
调用后to_xml
方法,您可以从缓冲区中检索 XML 内容并根据需要进行处理。
选择 XML 解析器
The processor
的参数to_xml
方法允许您指定要使用的 XML 解析器。 Pandas 支持以下解析器:
lxml
-
etree
(Python 内置xml.etree.ElementTree
)
让我们深入研究一下如何使用其中的每一个。
使用 lxml 作为处理器
To use lxml
,您首先需要安装它:
!pip install lxml
安装后,在to_xml
method:
df.to_xml("sample_data_lxml.xml", processor='lxml')
这将使用以下命令生成一个 XML 文件lxml
图书馆。结果与默认值类似,但是lxml
与标准库相比,可能会提供额外的功能。
使用 etree 作为处理器
指定方法如下:
df.to_xml("sample_data_etree.xml", processor='etree')
该命令使用以下命令写入 XML 数据etree
parser.
指定根元素的名称
在 XML 文档中,根元素是包含所有其他元素的最顶层元素。
The root_name
中的参数to_xml
方法允许您为根元素指定自定义名称以符合给定的 XML 架构。
假设我们要将根元素名称更改为“Employees”:
df.to_xml("sample_data.xml",root_name="Employees")
Output:
<?xml version='1.0' encoding='utf-8'?>
<Employees>
<row index="0">
<Name>Alice</Name>
<Age>25</Age>
<Occupation>Engineer</Occupation>
</row>
<row index="1">
<Name>Bob</Name>
<Age>30</Age>
<Occupation>Doctor</Occupation>
</row>
</Employees>
根元素现在被命名为<Employees>
,使 XML 结构对于该数据来说更具有语义意义。
删除索引
默认情况下,当使用以下方法将 DataFrame 转换为 XML 时to_xml
方法中,每行的索引都作为属性包含在内。
要从 XML 中排除索引,您可以设置index
的参数to_xml
to False
:
print(df.to_xml(root_name="Company", row_name="Employee", index=False))
Output:
<?xml version='1.0' encoding='utf-8'?>
<Company>
<Employee>
<Name>Alice</Name>
<Age>25</Age>
<Position>Engineer</Position>
</Employee>
<Employee>
<Name>Bob</Name>
<Age>30</Age>
<Position>Doctor</Position>
</Employee>
</Company>
The index
现在每个人都缺席了<Employee>
元素。
命名各个行元素
在根元素中,DataFrame 的每一行都被转换为单独的 XML 元素。默认情况下,该元素被命名为<row>
.
The row_name
参数允许您自定义这些单独行元素的名称。
更改行元素名称
假设我们希望每一行代表一个单独的“员工”。为了达成这个:
df.to_xml("sample_data.xml", root_name="Company", row_name="Employee")
Output:
<?xml version='1.0' encoding='utf-8'?>
<Company>
<Employee index="0">
<Name>Alice</Name>
<Age>25</Age>
<Occupation>Engineer</Occupation>
</Employee>
<Employee index="1">
<Name>Bob</Name>
<Age>30</Age>
<Occupation>Doctor</Occupation>
</Employee>
</Company>
每个数据条目现在都封装在一个<Employee>
元素。
指定默认 XML 命名空间
XML 命名空间用于区分可能具有相同名称但属于不同 XML 词汇表的 XML 元素和属性。
The namespaces
参数允许您为 XML 输出分配默认命名空间以及其他命名空间。
让我们为 XML 分配一个默认名称空间:
namespace = "http://www.example.com/employees"
df.to_xml("sample_data.xml", root_name="Company", row_name="Employee", namespaces={"": namespace})
Output:
<?xml version='1.0' encoding='utf-8'?>
<Company xmlns="http://www.example.com/employees">
<Employee index="0">
<Name>Alice</Name>
<Age>25</Age>
<Occupation>Engineer</Occupation>
</Employee>
<Employee index="1">
<Name>Bob</Name>
<Age>30</Age>
<Occupation>Doctor</Occupation>
</Employee>
</Company>
The xmlns
属性中的Company
根元素指定所有元素的默认名称空间。
分配多个命名空间
您还可以定义多个命名空间:
namespaces = {
"": "http://www.example.com/employees",
"role": "http://www.example.com/employee_roles"
}
df.to_xml("sample_data.xml", root_name="Company", row_name="Employee", namespaces=namespaces)
Output:
<?xml version='1.0' encoding='utf-8'?>
<Company xmlns="http://www.example.com/employees" xmlns:role="http://www.example.com/employee_roles">
<Employee index="0">
<Name>Alice</Name>
<Age>25</Age>
<Occupation>Engineer</Occupation>
</Employee>
<Employee index="1">
<Name>Bob</Name>
<Age>30</Age>
<Occupation>Doctor</Occupation>
</Employee>
</Company>
在此输出中,默认命名空间仍然是http://www.example.com/employees
,但我们还为“角色”添加了一个新的命名空间,可用于特定于员工角色的元素或属性。
要写入属性的列
有时,您不希望将 DataFrame 中的每一列表示为单独的元素,而是希望将其中一些列表示为另一个元素的属性。
The attr_cols
中的参数to_xml
方法允许您定义哪些列应呈现为属性。
假设我们希望“Age”列成为“Employee”元素的属性:
df.to_xml("sample_data.xml", root_name="Company", row_name="Employee", attr_cols=['Age'])
Output:
<?xml version='1.0' encoding='utf-8'?>
<Company>
<Employee index="0" Age="25"/>
<Employee index="1" Age="30"/>
</Company>
“Age”列现在表示为每个“Employee”元素的属性,而不是单独的子元素。
您可以使用以下方式表示省略的元素elem_cols
我们接下来会看到。
指定要写入为元素的列
The to_xml
方法提供了elem_cols
参数来指定哪些列应呈现为 XML 元素。
假设我们只想将“职业”列表示为一个元素:
df.to_xml("sample_data.xml", root_name="Company", row_name="Employee", elem_cols=['Occupation'])
Output:
<?xml version='1.0' encoding='utf-8'?>
<Company>
<Employee>
<index>0</index>
<Occupation>Engineer</Occupation>
</Employee>
<Employee>
<index>1</index>
<Occupation>Doctor</Occupation>
</Employee>
</Company>
通过使用elem_cols
参数中,只有“Occupation”列被表示为 XML 输出中的元素,而其他列被省略。
要表示其他省略的列,您可以将它们包含在elem_cols
范围。
用指定值替换 NaN
将数据导出到 XML 时,您的数据可能会缺少元素或为空元素。
如果您想用特定值替换缺失的元素。这to_xml
方法提供了na_rep
参数来解决这个问题。
首先,让我们创建一个具有 NaN 值的示例 DataFrame:
import pandas as pd
import numpy as np
data = {
'Name': ['Alice', 'Bob'],
'Age': [25, np.nan],
'Occupation': ['Engineer', 'Doctor']
}
df = pd.DataFrame(data)
print(df.to_xml(root_name="Company", row_name="Employee"))
Output:
<?xml version='1.0' encoding='utf-8'?>
<Company>
<Employee index="0">
<Name>Alice</Name>
<Age>25</Age>
<Occupation>Engineer</Occupation>
</Employee>
<Employee index="1">
<Name>Bob</Name>
<Age/>
<Occupation>Doctor</Occupation>
</Employee>
</Company>
请注意,对于鲍勃来说,<Age>
元素为空,因为 DataFrame 中的值为 NaN。
现在,让我们用字符串“Unknown”替换 NaN 值:
print(df.to_xml(root_name="Company", row_name="Employee", na_rep="Unknown"))
Output:
<?xml version='1.0' encoding='utf-8'?>
<Company>
<Employee index="0">
<Name>Alice</Name>
<Age>25</Age>
<Occupation>Engineer</Occupation>
</Employee>
<Employee index="1">
<Name>Bob</Name>
<Age>Unknown</Age>
<Occupation>Doctor</Occupation>
</Employee>
</Company>
随着na_rep
参数中,Bob 的“Age”列中的 NaN 值被替换为“Unknown”。
排除 XML 声明
宣言<?xml version='1.0' encoding='utf-8'?>
包含在大多数 XML 文档的顶部。
默认情况下,当您使用to_xml
,它包括 XML 声明。
如果您希望排除 XML 声明,请设置xml_declaration
参数为False
:
print(df.to_xml(root_name="Company", row_name="Employee", xml_declaration=False))
Output:
<Company>
<Employee index="0">
<Name>Alice</Name>
<Position>Engineer</Position>
</Employee>
<Employee index="1">
<Name>Bob</Name>
<Position>Doctor</Position>
</Employee>
</Company>
选择包含或排除 XML 声明通常取决于将处理 XML 的目标应用程序或系统。
禁用漂亮打印
The to_xml
Pandas 中的方法有一个名为pretty_print
控制 XML 输出的缩进以获得更好的可读性。
默认情况下,to_xml
方法输出带缩进的 XML。
要禁用缩进,请设置pretty_print
参数为False
:
import pandas as pd
data = {
'Name': ['Alice', 'Bob'],
'Position': ['Engineer', 'Doctor']
}
df = pd.DataFrame(data)
print(df.to_xml(root_name="Company", row_name="Employee", pretty_print=False))
Output:
<?xml version='1.0' encoding='utf-8'?><Company><Employee index="0"><Name>Alice</Name><Position>Engineer</Position></Employee><Employee index="1"><Name>Bob</Name><Position>Doctor</Position></Employee></Company>
应用 XSLT 样式表
当您想要更改 XML 文档的结构或将其转换为不同的格式时,XSLT 特别有用。
您可以使用stylesheet
的参数to_xml
将 XSLT 样式表应用到 XML 输出的方法。
首先,让我们生成 DataFrame 的简单 XML 表示形式:
import pandas as pd
data = {
'Name': ['Alice', 'Bob'],
'Position': ['Engineer', 'Doctor']
}
df = pd.DataFrame(data)
print(df.to_xml(root_name="Company", row_name="Employee"))
Output:
<?xml version='1.0' encoding='utf-8'?>
<Company>
<Employee index="0">
<Name>Alice</Name>
<Position>Engineer</Position>
</Employee>
<Employee index="1">
<Name>Bob</Name>
<Position>Doctor</Position>
</Employee>
</Company>
假设我们有以下 XSLT 样式表,可将 XML 转换为 HTML:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>Company Employees</h2>
<table border="1">
<tr>
<th>Name</th>
<th>Position</th>
</tr>
<xsl:for-each select="Company/Employee">
<tr>
<td><xsl:value-of select="Name"/></td>
<td><xsl:value-of select="Position"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
该 XSLT 将 XML 数据转换为 HTML 表。
现在,让我们应用这个样式表:
xslt = '''...''' # The XSLT content shown above
print(df.to_xml(root_name="Company", row_name="Employee", stylesheet=xslt))
Output:
<html>
<body>
<h2>Company Employees</h2>
<table border="1">
<tr>
<th>Name</th>
<th>Position</th>
</tr>
<tr>
<td>Alice</td>
<td>Engineer</td>
</tr>
<tr>
<td>Bob</td>
<td>Doctor</td>
</tr>
</table>
</body>
</html>
注意:不要在 XSLT 样式表的开头留下任何空格,以避免错误。
定义压缩类型
The to_xml
Pandas 中的方法提供了compression
参数使您能够在导出 XML 数据时指定压缩类型。
要通过压缩保存 XML 数据,您可以指定compression
范围:
# Saving the XML with gzip compression
df.to_xml("output.xml.gz", root_name="Company", row_name="Employee", compression='gzip')
使用此代码,XML 内容将使用 gzip 格式压缩并保存为output.xml.gz
.
Pandas to_xml
支持多种压缩类型,包括:
读取压缩的 XML 数据
值得注意的是,如果您以压缩格式保存 XML 并希望将其读回到 DataFrame 中,则可以使用以下命令轻松完成此操作熊猫read_xml功能:
compressed_df = pd.read_xml("output.xml.gz", compression='gzip')
print(compressed_df)
Output:
Name Position
0 Alice Engineer
1 Bob Doctor
2 Charlie Artist
存储连接选项
The to_xml
Pandas 中的方法包括storage_options
参数,允许您传递用于存储连接的额外选项的字典,例如云存储提供商或分布式文件系统。
例如,如果您使用 Amazon S3,您可能需要提供特定凭证:
s3_options = {
'key': 'YOUR_ACCESS_KEY',
'secret': 'YOUR_SECRET_KEY',
'use_ssl': False # Example option to not use SSL (default is True)
}
df.to_xml("s3://my_bucket/output.xml", root_name="Company", row_name="Employee", storage_options=s3_options)
请注意:在代码中对凭据进行硬编码时请务必小心。使用环境变量或其他方法来保密源代码会更安全。
Resource
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_xml.html