我有一个xlsx数据集,其中一列在xml中。我将其加载到python的数据框中。因此,数据框的一列具有xml条目。我想解析该列,以便每个xml变量在我的数据框中都是一个不同的列。我不是数据格式化专家,并且试图在数小时内未能成功产生这种结果,复制了我在堆栈溢出时可以找到的点点滴滴的代码。 因此,任何帮助将不胜感激。 一件事是我需要所有代码都在python中,这就是为什么我不尝试直接修改xlsx数据集的原因。
有关数据的更多详细信息:
此数据引用了公司的不同线索。每行都有有关个别线索的信息。数据帧的几列格式正确(它们具有字符串或数据条目),并且其中一列包含xml信息。
下面是xml_result列的xml信息的一位线索的一个示例。我要提取的是<demande>...</demande>
中的所有信息,数据框中每个变量的一列(例如,在这里我想为LOGIN
分配一列,为MDP
分配一列, ...,一个代表REQ_NAME_1
等)。
请注意,对于每个潜在客户,<demande>
中可能会有不同数量的信息(例如,对于另一个潜在客户来说,可能存在REQ_NAME_2)。
所以我现在只有一列,其中典型行具有以下信息:
<?xml version="1.0" encoding="ISO-8859-1"?>
<pisteAuditProfilingQualif>
<resultat>
<typeProfilQualif>Profil Standard (2)</typeProfilQualif>
</resultat>
<controles>
<controle>
<typeControle>Taux d'endettement après si hypo (4)</typeControle>
<typeProfilQualif>Profil Prioritaire (1)</typeProfilQualif>
</controle>
</controles>
<demande>
<LOGIN>BOI</LOGIN>
<MDP>BOI_ws2010</MDP>
<AG_ID>7</AG_ID>
<overflow>1</overflow>
<PRT_ID>818</PRT_ID>
<REQ_TITLE_1>Mademoiselle</REQ_TITLE_1>
<REQ_NAME_1>Test</REQ_NAME_1>
</demande>
</pisteAuditProfilingQualif>
,我希望数据框的最后一行具有与需求中变量一样多的列。例如此处:
LOGIN MDP AG_ID overflow PRT_ID REQ_TITLE_1 EMP_ID_CIVILITE REQ_NAME_1
BOI BOI_ws2010 7 1 818 Mademoiselle 2 Test
答案 0 :(得分:0)
使用ElementTree.fromstring解析数据框中的xml,然后使用Element.iter()遍历'demande'的子元素,最后将新数据框与旧数据框连接。
import pandas as pd
import xml.etree.ElementTree as ET
xml1 = """<?xml version="1.0" encoding="ISO-8859-1"?>
<pisteAuditProfilingQualif>
...
<demande>
...
</demande>
</pisteAuditProfilingQualif>"""
xml2 = """<?xml version="1.0" encoding="ISO-8859-1"?>
...
<demande>
...
<REQ_TITLE_2>Sirrah!</REQ_TITLE_2>
<REQ_NAME_2>George</REQ_NAME_2>
</demande>
</pisteAuditProfilingQualif>"""
df = pd.DataFrame({'a':[42, 54],'xml':[xml1, xml2]})
dfx = pd.DataFrame()
for x in df.xml:
ex = ET.fromstring(x)
ed = ex.find('demande')
dfx = dfx.append(dict([(e.tag, e.text) for e in ed.iter()]), ignore_index=True)
print(df.join(dfx))
a xml ... REQ_NAME_2 REQ_TITLE_2
0 42 <?xml version="1.0" encoding="ISO-8859-1"?>\n ... ... NaN NaN
1 54 <?xml version="1.0" encoding="ISO-8859-1"?>\n ... ... George Sirrah!
[2 rows x 12 columns]