我有如下的XML文件。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<pbsCrew>
<schedulePeriod>
<startDate>2022-06-02</startDate>
<endDate>2022-07-01</endDate>
</schedulePeriod>
<crewMembers>
<crewMember>
<id>12345</id>
<firstName>John</firstName>
<middleName>S</middleName>
<lastName>Doe</lastName>
<seniorityNumber>2</seniorityNumber>
<base>DFW</base>
<division>I</division>
<seat>CA</seat>
<flightQualification>
<hitcities/>
<monthlyMax>9983</monthlyMax>
<volMax>0</volMax>
<restricted75HrCities>
<city>
<code>GUC</code>
</city>
<city>
<code>MSO</code>
</city>
</city>
</restricted75HrCities>
<equipmentTypes>
<equipment>
<type>777</type>
</equipment>
</equipmentTypes>
<green>false</green>
<isVaccinated>true</isVaccinated>
</flightQualification>
<bidQualification>
<canBid>true</canBid>
<canBeAwarded>true</canBeAwarded>
</bidQualification>
</crewMember>
<crewMember>
<id>22222</id>
<firstName>JANE</firstName>
<middleName>R</middleName>
<lastName>DOE</lastName>
<seniorityNumber>8</seniorityNumber>
<base>DFW</base>
<division>I</division>
<seat>CA</seat>
<flightQualification>
<hitcities>
<hitcity>
<code>OAX</code>
</hitcity>
<hitcity>
<code>MSO</code>
</hitcity>
<hitcity>
<code>US</code>
</hitcity>
</hitcities>
<monthlyMax>7642</monthlyMax>
<volMax>0</volMax>
<restricted75HrCities/>
<equipmentTypes>
<equipment>
<type>787</type>
</equipment>
</equipmentTypes>
<green>false</green>
<trainerLineCheck>false</trainerLineCheck>
<trainerLineIndoctrination>false</trainerLineIndoctrination>
<isVaccinated>true</isVaccinated>
</flightQualification>
<bidQualification>
<canBid>true</canBid>
<canBeAwarded>true</canBeAwarded>
</bidQualification>
</crewMember>
</crewMembers>
</pbsCrew>
我想解析crewMember标签,并从中获取id、姓氏、姓氏以及flightQualification中的iSaventured标签,所有这些都放在一个Pandas数据框中,如下所示:
我知道这将涉及一个for循环来检索firstName和lastName值,但在提取我需要的所有值时遇到困难。有没有快速的方法来做到这一点?
虽然可以通过循环使用elementtree或lxml库来实现,但是使用pandas read_xml()方法并使用stylesheet属性也可以实现相同的目标。该属性指定用于转换原始xml的XSL样式表。在您的情况下,需要将其扁平化,使所有感兴趣的元素都包含在一个父元素中,作为一行。
下面是一个例子:
xml = '''<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<pbsCrew>
<schedulePeriod>
<startDate>2022-06-02</startDate>
<endDate>2022-07-01</endDate>
</schedulePeriod>
<crewMembers>
<crewMember>
<id>12345</id>
<firstName>John</firstName>
<middleName>S</middleName>
<lastName>Doe</lastName>
<seniorityNumber>2</seniorityNumber>
<base>DFW</base>
<division>I</division>
<seat>CA</seat>
<flightQualification>
<hitcities/>
<monthlyMax>9983</monthlyMax>
<volMax>0</volMax>
<restricted75HrCities>
<city>
<code>GUC</code>
</city>
<city>
<code>MSO</code>
</city>
</restricted75HrCities>
<equipmentTypes>
<equipment>
<type>777</type>
</equipment>
</equipmentTypes>
<green>false</green>
<isVaccinated>true</isVaccinated>
</flightQualification>
<bidQualification>
<canBid>true</canBid>
<canBeAwarded>true</canBeAwarded>
</bidQualification>
</crewMember>
<crewMember>
<id>22222</id>
<firstName>JANE</firstName>
<middleName>R</middleName>
<lastName>DOE</lastName>
<seniorityNumber>8</seniorityNumber>
<base>DFW</base>
<division>I</division>
<seat>CA</seat>
<flightQualification>
<hitcities>
<hitcity>
<code>OAX</code>
</hitcity>
<hitcity>
<code>MSO</code>
</hitcity>
<hitcity>
<code>US</code>
</hitcity>
</hitcities>
<monthlyMax>7642</monthlyMax>
<volMax>0</volMax>
<restricted75HrCities/>
<equipmentTypes>
<equipment>
<type>787</type>
</equipment>
</equipmentTypes>
<green>false</green>
<trainerLineCheck>false</trainerLineCheck>
<trainerLineIndoctrination>false</trainerLineIndoctrination>
<isVaccinated>true</isVaccinated>
</flightQualification>
<bidQualification>
<canBid>true</canBid>
<canBeAwarded>true</canBeAwarded>
</bidQualification>
</crewMember>
</crewMembers>
</pbsCrew>
'''
import pandas as pd
stylesheet = '''<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:template match="/">
<members>
<xsl:apply-templates select="//crewMember"/>
</members>
</xsl:template>
<xsl:template match="//crewMember">
<crewMember>
<ID>
<xsl:value-of select="./id"/>
</ID>
<firstname>
<xsl:value-of select="./firstName"/>
</firstname>
<lastname>
<xsl:value-of select="./lastName"/>
</lastname>
<isVaccinated>
<xsl:value-of select="./flightQualification/isVaccinated"/>
</isVaccinated>
</crewMember>
</xsl:template>
</xsl:stylesheet>'''
df = pd.read_xml(xml, xpath="//crewMember", stylesheet = stylesheet)
print(df)
这里,样式表将原始XML转换为以下形式:
<?xml version="1.0" encoding="UTF-8"?>
<members>
<crewMember>
<ID>12345</ID>
<firstname>John</firstname>
<lastname>Doe</lastname>
<isVaccinated>true</isVaccinated>
</crewMember>
<crewMember>
<ID>22222</ID>
<firstname>JANE</firstname>
<lastname>DOE</lastname>
<isVaccinated>true</isVaccinated>
</crewMember>
</members>
这允许我们使用xpath<code>//crewMember</code>将<code>Crewmembers</code>元素的子元素作为dataframe行字段。
在Python3下,我有一个dict,格式如下: 我想使用dict键作为列将其转换为数据帧: 但是,当我尝试以下命令时,我有一个ValueError:
问题内容: 我对熊猫有些陌生。我有一个熊猫数据框,它是1行乘23列。 我想将其转换为系列吗?我想知道最pythonic的方法是什么? 我试过了,但是抱怨。它不够聪明,无法意识到它仍然是数学上的“向量”。 谢谢! 问题答案: 它不够聪明,无法意识到它仍然是数学上的“向量”。 可以说它足够聪明,可以识别尺寸差异。:-) 我认为您可以做的最简单的事情是使用位置选择该行,这将为您提供一个Series,其列
假设熊猫数据帧如下所示: 如何将第三行(如row3)提取为pd数据帧?换句话说,row3.shape应该是(1,5),row3.head()应该是:
问题内容: 我正在使用python 3.6并尝试使用以下代码将json文件(350 MB)下载为pandas数据框。但是,出现以下错误: 我该如何解决错误? 问题答案: 如果以二进制()格式打开文件,则会得到字节。怎么样:
问题内容: 我有以下熊猫数据框: 我想将日期时间索引转换为数据框的列。我尝试过,但结果没有改变。任何想法? 问题答案: 需要分配输出或参数:
我想读取ArcGIS形状文件的文件,并将其转储到数据帧中。我目前正在使用dbf包。 显然,我已经能够将文件作为一个表加载,但还不能理解如何解析它并将其转换为一个数据帧。怎么做? 这就是我所处的困境: Python将此语句作为输出返回,坦率地说,我不知道该如何处理: 编辑 我的原始示例: