我的python数据框的一列包含xml格式的数据:如何解析?

时间:2019-05-24 17:37:17

标签: python xml

我有一个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

1 个答案:

答案 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]