pandas read_xml缺少数据



我尝试过使用Pandas read_xml,它可以很好地读取大部分xml,但它忽略了一些部分,因为它的格式略有不同。我在下面包含了一个摘录,它写着";类型"激活";很好,但不适合";金额"价值它拾取列标题";金额"只是没有价值。有人能给我指一下正确的方向吗?谢谢

<Type>PYI</Type>
<Activation>N</Activation>
<Amt val="4000" curr="GBP"/>
xml_df = pd.read_xml(xml_data)

有人能帮我吗?我试过浏览Pandas.read_xml的文档,但我明白为什么它不会接受这个?

默认情况下,pandas.read_xml解析一组节点的所有立即子节点,包括其子节点和属性。除非xpath参数指示,否则read_xml不会超过立即子代。

以说明您的用例。下面可能是您的XML的一般设置,其中解析<Type>及其兄弟<Activation><Amt>。但是,<Amt>不包含文本节点,只包含属性。因此,该列中的值应该为空。

<root>
<row>
<Type>PYI</Type>              <!-- Type IS A CHILD NODE OF row -->
<Activation>N</Activation>    <!-- Activation IS A CHILD NODE OF row -->
<Amt val="4000" curr="GBP"/>  <!-- Amt IS A CHILD NODE OF row -->
</row>
</root>

但是您会问,为什么read_xml忽略了valcurr属性?因为每个都不是<row>立即后代。他们是<Amt>的后代(即<row>的孙子(。如果属性被移动到<row>,那么它们将被捕获,如下所示:

<root>
<row val="4000" curr="GBP">     <!-- val AND curr ARE CHILD ATTRIBS OF row -->
<Type>PYI</Type>              <!-- Type IS A CHILD NODE OF row -->
<Activation>N</Activation>    <!-- Activation IS A CHILD NODE OF row -->
<Amt/>                        <!-- Amt IS A CHILD NODE OF row -->
</row>
</root>

要捕获这些属性,请调整xpath参数以指向其直接父级:

amt_df = pd.read_xml("Input.xml", xpath="//Amt")

要使用<row>级别的信息捕获这些属性,请考虑使用特殊用途语言XSLT将原始XML转换为以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<root>
<row>
<Type>PYI</Type>
<Activation>N</Activation>
<Amt_val>4000</Amt_val>
<Amt_curr>GBP</Amt_curr>
</row>
</root>

以上是read_xml在使用stylesheet参数时解析的中间输出,如下所示:

xsl = '''<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="row">
<xsl:copy>
<xsl:copy-of select="*[name() != 'Amt']"/>
<Amt_val><xsl:value-of select="Amt/@val"/></Amt_val>
<Amt_curr><xsl:value-of select="Amt/@curr"/></Amt_curr>
</xsl:copy>
</xsl:template>

</xsl:stylesheet>'''
row_df = pd.read_xml("Input.xml", xpath="//row", stylesheet=xsl")

相关内容

  • 没有找到相关文章

最新更新