Python Pandas pandas.read_xml函数方法的使用

Pandas是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。Pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。本文主要介绍一下Pandas中read_xml方法的使用。

pandas.read_xml(path_or_buffer, xpath='./*', namespaces=None, elems_only=False, attrs_only=False, names=None, encoding='utf-8', parser='lxml', stylesheet=None, compression='infer', storage_options=None) [源代码]

将XML文档读入DataFrame对象。

1.3.0 新版功能。

参数:

path_or_bufferstrpath对象 或 file-like 对象

字符串,path对象(实现os.PathLike[str]),

或实现read()函数的类文件对象。

字符串可以是任何有效的XML字符串或path。

该字符串还可以是URL。有效的URL包括http、ftp、s3和file。

xpathstr, 可选的, 默认为 ‘./*

用于解析迁移到DataFrame所需的节点集的XPath。

XPath应该返回一个元素集合,而不是一个元素。

注意:etree解析器支持有限的XPath表达式。

对于更复杂的XPath,使用需要安装的lxml

namespacesdict, 可选的

XML文档中定义的名称空间为字典,

key为名称空间前缀,value为URI。

不需要在XML中包含所有名称空间,

只需要包含xpath表达式中使用的名称空间。

注意:如果XML文档使用默认名称空间,

表示为 xmlns=’<URI>’而没有前缀,

则必须为URI分配任何临时名称空间前缀,

如 'doc',以便解析底层节点和/或属性。例如,

namespaces = {"doc": "https://example.com"}

elems_onlybool, 可选的, 默认为 False

只解析指定xpath的子元素。

默认情况下,返回所有子元素和非空文本节点。

attrs_onlybool, 可选的, 默认为 False

只解析指定xpath的属性。默认情况下,返回所有属性。

names:list-like, 可选

已解析XML数据的DataFrame的列名。

使用此参数重命名原始元素名称,并区分相同的命名元素。

encoding:str, 可选的, 默认为 ‘utf-8’

XML 文档的编码。

parser{'lxml','etree'}, 默认为 'lxml'

用于检索数据的解析器模块。只支持‘lxml’ 和‘etree’。

使用“lxml”可以支持更复杂的XPath搜索和使用XSLT样式表的能力。

stylesheetstr, path 对象 或 file-like 对象

URL、file-like对象或包含XSLT脚本的原始字符串。

这个样式表应该使复杂的、深度嵌套的XML文档变得扁平,

从而更容易解析。要使用此特性,

必须安装lxml模块并指定'lxml'作为parser

xpath必须引用XSLT转换后生成的已转换XML文档的节点,

而不是原始XML文档。目前只支持XSLT 1.0脚本,

不支持更高的版本。

compressionstrdict, 默认为'infer'

用于对磁盘上的数据进行实时解压。

如果'infer'和'path_or_buffer'是path-like,

那么检测以下扩展名的压缩:‘.gz’, ‘.bz2’, ‘.zip’, ‘.xz’, 

或 ‘.zst’(否则不压缩)。如果使用'zip',

则zip文件必须只包含一个要读入的数据文件。

如果不解压,请设置为None。也可以是一个字典,

'method'设置为{'zip', 'gzip', 'bz2', 'zstd'}

其他键值对被转发到zipfile.ZipFile, gzip.GzipFile

bz2.BZ2File, 或zstandard.ZstdDecompressor

例如,

可以使用自定义压缩字典传递以下信息,

用于Zstandard解压缩:

compression={'method':'zstd','dict_data': my_compression_dict}

注意:在1.4.0版更改:Zstandard支持。

storage_optionsdict, 可选的

对于特定存储连接有意义的额外选项,例如,

主机、端口、用户名、密码等。对于HTTP(S) url, 

对于HTTP(S) url,键值对作为头选项转发到urllib

对于其他url(例如,

以“s3://”,和“gcs://”开头)键-值对被转发到fsspec

请参阅fsspecurllib了解更多细节。

返回:

df

DataFrame

Notes

这种方法的最佳设计是导入以下格式的浅层XML文档,这种格式非常适合DataFrame的二维(按列排列)。

<root>
    <row>
      <column1>data</column1>
      <column2>data</column2>
      <column3>data</column3>
      ...
   </row>
   <row>
      ...
   </row>
   ...
</root>

作为一种文件格式,XML文档可以以任何方式设计,包括元素和属性的布局,只要它符合W3C规范。因此,该方法对于特定的扁平设计(而不是所有可能的XML结构)是一种方便的处理程序。

但是,对于更复杂的XML文档,样式表允许使用XSLT(一种特殊用途的语言)临时重新设计原始文档,以获得一个更均匀的的版本,以便迁移到DataFrame

此函数将始终返回单个DataFrame或由于XML文档、xpath或其他参数的问题而引发异常。

例如,

>>> xml = '''<?xml version='1.0' encoding='utf-8'?>
... <data xmlns="http://example.com">
...  <row>
...    <shape>square</shape>
...    <degrees>360</degrees>
...    <sides>4.0</sides>
...  </row>
...  <row>
...    <shape>circle</shape>
...    <degrees>360</degrees>
...    <sides/>
...  </row>
...  <row>
...    <shape>triangle</shape>
...    <degrees>180</degrees>
...    <sides>3.0</sides>
...  </row>
... </data>'''
>>> df = pd.read_xml(xml)
>>> df
      shape  degrees  sides
0    square      360    4.0
1    circle      360    NaN
2  triangle      180    3.0

>>> xml = '''<?xml version='1.0' encoding='utf-8'?>
... <data>
...   <row shape="square" degrees="360" sides="4.0"/>
...   <row shape="circle" degrees="360"/>
...   <row shape="triangle" degrees="180" sides="3.0"/>
... </data>'''
>>> df = pd.read_xml(xml, xpath=".//row")
>>> df
      shape  degrees  sides
0    square      360    4.0
1    circle      360    NaN
2  triangle      180    3.0
>>> xml = '''<?xml version='1.0' encoding='utf-8'?>
... <doc:data xmlns:doc="https://example.com">
...   <doc:row>
...     <doc:shape>square</doc:shape>
...     <doc:degrees>360</doc:degrees>
...     <doc:sides>4.0</doc:sides>
...   </doc:row>
...   <doc:row>
...     <doc:shape>circle</doc:shape>
...     <doc:degrees>360</doc:degrees>
...     <doc:sides/>
...   </doc:row>
...   <doc:row>
...     <doc:shape>triangle</doc:shape>
...     <doc:degrees>180</doc:degrees>
...     <doc:sides>3.0</doc:sides>
...   </doc:row>
... </doc:data>'''
>>> df = pd.read_xml(xml,
...                  xpath="//doc:row",
...                  namespaces={"doc": "https://example.com"})
>>> df
      shape  degrees  sides
0    square      360    4.0
1    circle      360    NaN
2  triangle      180    3.0

推荐阅读
cjavapy编程之路首页