【问题标题】:How to create pandas DataFrame from nested xml如何从嵌套的 xml 创建 pandas DataFrame
【发布时间】:2019-04-26 05:43:40
【问题描述】:

我正在尝试使用 XML 创建 Pandas 数据框。 XML 如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Products>
    <Info>
        <Msg>Shop items.</Msg>
    </Info>
    <shop shopNr="01">
        <ItemNr>1001</ItemNr>
        <ItemNr>1002</ItemNr>
        <ItemNr>1003</ItemNr>
        <ItemNr>1004</ItemNr>
                <ItemNr>1010</ItemNr>
    </shop>
    <shop shopNr="02">
        <ItemNr>1002</ItemNr>
        <ItemNr>1006</ItemNr>
        <ItemNr>1005</ItemNr>
    </shop>
    <shop shopNr="03">
        <ItemNr>1009</ItemNr>
        <ItemNr>1006</ItemNr>
        <ItemNr>1005</ItemNr>
        <ItemNr>1002</ItemNr>
    </shop>
</Products>

我尝试使用 XML Etree 作为下面的代码。我有两个问题。

首先,我无法将 ItemNr 的值作为根的子项。而不是获得价值,即。 1001,我明白了

<Element 'ItemNr' at 0x000001E2D6C41B38>.

第二个问题是当我从列表中创建数据框时。我最终有一个项目列表列表。虽然由于我无法获得上述值,所以现在结果为空,但我希望得到一个扁平列表。

import xml.etree.ElementTree as ET
import pandas as pd
data = 'example_shops.xml'
tree = ET.parse(data)
root = tree.getroot()

shops = []
items = []
for node in root.iter('shop'):
    shops.append(node.attrib.get('shopNr'))
    items.append(list(node))

d = {'shops': shops, 'items': items}
df = pd.DataFrame(d)

生成的 DataFrame。

 shops                 items
0    01  [[], [], [], [], []]
1    02          [[], [], []]
2    03      [[], [], [], []]

想要的输出是:


 shops                 items
0    01  [1001, 1002, 1003, 1004, 1010]
1    02          [1002, 1006, 1005]
2    03      [1009, 1006, 1005, 1002]

【问题讨论】:

标签: python xml pandas


【解决方案1】:

您希望将位于 shop 元素下的 ItemNr 元素中的文本值附加到项目列表,而不是您正在执行的 xml Element python 对象。

以下代码对我有用:

items.append([item_nr_element.text for item_nr_element in node.getchildren()])

【讨论】:

    【解决方案2】:

    我希望这是预期的输出:

    import xml.etree.ElementTree as ET
    import pandas as pd
    data = 'example_shops.xml'
    tree = ET.parse(data)
    root = tree.getroot()
    shops_items = []
    all_shops_items = []
    for ashop in root.iter('shop'):
        items = []
        shop_Nr = ashop.attrib.get('shopNr')
        for anitem in ashop.iter('ItemNr'):
            items.append(anitem.text)
        shops_items = [shop_Nr,items]
        all_shops_items.append(shops_items)
    df = pd.DataFrame(all_shops_items,columns=['SHOP_NUMBER','ITEM_NUMBER'])        
    print(df)
    

    输出:

      SHOP_NUMBER                     ITEM_NUMBER
    0          01  [1001, 1002, 1003, 1004, 1010]
    1          02              [1002, 1006, 1005]
    2          03        [1009, 1006, 1005, 1002]
    

    如果您想要有个别商品的商店:

    import xml.etree.ElementTree as ET
    import pandas as pd
    data = 'example_shops.xml'
    tree = ET.parse(data)
    root = tree.getroot()
    shops_items = []
    all_shops_items = []
    for ashop in root.iter('shop'):
        shop_Nr = ashop.attrib.get('shopNr')
        for anitem in ashop.iter('ItemNr'):
            item_Nr = anitem.text
            shops_items = [shop_Nr,item_Nr]
            all_shops_items.append(shops_items)
    df = pd.DataFrame(all_shops_items,columns=['SHOP_NUMBER','ITEM_NUMBER'])        
    print(df)
    

    输出:

       SHOP_NUMBER ITEM_NUMBER
    0           01        1001
    1           01        1002
    2           01        1003
    3           01        1004
    4           01        1010
    5           02        1002
    6           02        1006
    7           02        1005
    8           03        1009
    9           03        1006
    10          03        1005
    11          03        1002
    

    【讨论】:

    • 是的,第一个选项就是输出。第二个选项以后也可能对我有所帮助。谢谢
    猜你喜欢
    • 1970-01-01
    • 2014-02-24
    • 2020-12-26
    • 2017-05-08
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    相关资源
    最近更新 更多