我在将一个XML文件导入到Pandas时遇到了麻烦,因为我需要从两个父 node 获取数据.一个父 node (AgentID)具有直接在其中的数据,而另一个(Sales)具有包含数据的子 node (LocationSizeStatus),如下所示.

test_xml = '''<TEST_XML>
        <Sales>
            <AgentID>0001</AgentID>
            <Sale>
                <Location>0</Location>
                <Size>1000</Size>
                <Status>Available</Status>
            </Sale>
            <Sale>
                <Location>1</Location>
                <Size>500</Size>
                <Status>Unavailable</Status>
            </Sale>
        </Sales>
    </TEST_XML>'''

当我try 将其导入到Pandas Dataframe时,下面是我能够获取Sale标签下的数据的唯一方法.

import pandas as pd
df = pd.read_xml(test_xml, xpath='//Sale')

这为我提供了如下所示的数据帧:

    Location    Size    Status
0   0           1000    Available
1   1           500     Unavailable

我需要的是在DataFrame中也包括AgentID标签,以获得以下内容,但我没有成功.为清楚起见,预期输出如下:

    AgentID     Location    Size    Status
0   0001        0           1000    Available
1   0001        1           500     Unavailable

有没有办法将xpath参数也包括在AgentID标记中,或者使用Pandas的read_xml函数不可能做到这一点?我试着传递一个像xpath=['//AgentID', '//Sale']这样的列表,但当然,它不起作用……

推荐答案

我不认为仅使用read_xml()就可以获得所需的输出;然而,稍微操纵一下它是可能的.从本质上讲,其思想是使用通用XPath从XML获取所有内容, Select 所需的列,将AgentID列填充为对应于Sale列;然后删除多余的行.

df = pd.read_xml(io.StringIO(test_xml), xpath='//*', dtype=str)[['AgentID', 'Location', 'Size', 'Status']]
df['AgentID'] = df['AgentID'].ffill()
df = df.dropna(how='any').astype({'Location': int, 'Size': int}).reset_index(drop=True)

output


获取父 node 的一个"更简单"的解决方案(尽管与OP中的确切问题无关)是将XML转换为Python字典,并使用pd.json_normalize将其规范化为嵌套框架.这是因为可以在这里指定Meta字段(在本例中为AgentID).但是,我们需要安装第三方库(xmltodict)来实现第一步.

!pip install xmltodict
import xmltodict
df = (
    pd.json_normalize(xmltodict.parse(test_xml)['TEST_XML']['Sales'], 
                      record_path=['Sale'], meta=['AgentID'])
    [['AgentID', 'Location', 'Size', 'Status']]
)

Python相关问答推荐

单击cookie按钮,但结果不一致

Python在通过Inbox调用时给出不同的响应

Python中的锁定类和线程以实现dict移动

尽管进程输出错误消息,subProcess.check_call的CalledProcess错误.stderr为无

Odoo onchange for invoice_Status of sale事件.订单未触发

当测试字符串100%包含查询字符串时,为什么t fuzzywuzzy s Process.extractBests不给出100%分数?

无法导入已安装的模块

给定数据点,制定它们的关系

如何根据日期和时间将状态更新为已过期或活动?

如何让 turtle 通过点击和拖动来绘制?

试图找到Python方法来部分填充numpy数组

在Python中处理大量CSV文件中的数据

如何在Python中将returns.context. DeliverresContext与Deliverc函数一起使用?

优化pytorch函数以消除for循环

使用@ guardlasses. guardlass和注释的Python继承

如何将多进程池声明为变量并将其导入到另一个Python文件

Pandas DataFrame中行之间的差异

为什么Django管理页面和我的页面的其他CSS文件和图片都找不到?'

在www.example.com中使用`package_data`包含不包含__init__. py的非Python文件

基于形状而非距离的两个numpy数组相似性