如何在python中将xml视为数据帧?

2024-06-28 19:38:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个input.xml示例:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <bathrooms>
        <n35237 type="number">1.0</n35237>
        <n32238 type="number">3.0</n32238>
        <n44699 type="number">nan</n44699>
    </bathrooms>
    <price>
        <n35237 type="number">7020000.0</n35237>
        <n32238 type="number">10000000.0</n32238>
        <n44699 type="number">4128000.0</n44699>
    </price>
    <property_id>
        <n35237 type="number">35237.0</n35237>
        <n32238 type="number">32238.0</n32238>
        <n44699 type="number">44699.0</n44699>
    </property_id>
</root>

我想把它作为一个数据框架来分析。我使用的代码如下:

import pandas as pd
import xml.etree.ElementTree as ET

tree = ET.parse('input.xml')
root = tree.getroot()

def f(elem, result):
    result[elem.tag] = elem.text
    cs = list(elem)
    for c in cs:
        result = f(c, result)
    return result

d = f(root, {})
df=pd.DataFrame(d.items())
print(df)

问题是,数据框架没有xml文件那么重要。它只显示xml的最后一个节点,因为节点的名称重复它们自己。如何查看所有xml节点及其对应的值,而不需要指定节点的名称?(这样就可以对任何自定义xml执行此操作)


Tags: idnumberinput节点typepropertyrootxml
2条回答

请尝试以下步骤

import pandas_read_xml as pdx
df = pdx.read_xml("test.xml", ['first-tag', 'second-tag', 'the-tag-you-want-as-root'])

默认情况下,pandas read xml将根标记视为pandas数据帧的“行”。如果这不是真的,则传递参数root_is_rows=False

*有时候,XML结构会让pandas以一种我们认为是相反的方式对待行和列。对于这些情况,read_xml()可能会失败。在这种情况下,尝试使用transpose=True作为参数。只有在传递root_is_rows=False时,此参数才会影响读取

资料来源:https://pypi.org/project/pandas-read-xml/#:~:text=Read%20XML%20as%20pandas%20dataframe,want%20to%20extract%20the%20data.&text=By%20default%2C%20pandas%2Dread%2D,pass%20the%20argument%20root_is_rows%3DFalse%20

由于您想要的行是root的孙子,请尝试将嵌套字典理解传递到DataFrame构造函数中。下面使用float强制转换节点文本。如果内容不是全部小数点,则删除

import pandas as pd
import xml.etree.ElementTree as ET

tree = ET.parse('Input.xml')

data = {
    node.tag: {i.tag: float(i.text) for i in node.findall("*")}
    for node in tree.findall("*")
}

property_df = pd.DataFrame(data)
property_df
#        bathrooms       price property_id
# n35237       1.0   7020000.0     35237.0
# n32238       3.0  10000000.0     32238.0
# n44699       NaN   4128000.0     44699.0

相关问题 更多 >