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

2024-09-25 06:28:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个xlsx数据集,其中一列是xml。我用python把它加载到一个数据帧中。因此,我的数据框的一列有xml条目。我想解析该列,以便每个xml变量在我的数据帧中都是不同的列。我不是一个数据格式化专家,我已经尝试了好几个小时没有成功地产生这个结果,复制了我可以在堆栈溢出中找到的一些代码。 所以任何帮助都会非常感激。 有一点是,我需要所有的代码都在python中,这就是为什么我不尝试直接修改xlsx数据集的原因。你知道吗

有关数据的详细信息:
这些数据为一家公司提供了不同的线索。每行都有关于单个潜在客户的信息。数据框的几列格式正确(它们有字符串或数据项),其中一列包含xml信息。
下面是xml\u result列的xml info的一个lead示例。我想提取的是<demande>...</demande>中的所有信息,每个变量在我的数据帧中有一列(例如这里我想为LOGIN提取一列,为MDP提取一列,…,为REQ_NAME_1提取一列)。等等)。 请注意,对于每个潜在客户,<demande>中的信息量可能不同(例如,对于另一个潜在客户,可能有一个REQ\u NAME\u 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>

我希望我的数据帧的最后一行有和demande中的变量一样多的列。例如:

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

Tags: 数据name信息id客户loginxmlreq
1条回答
网友
1楼 · 发布于 2024-09-25 06:28:45

使用ElementTree.fromstring要解析数据帧中的xml,则元素.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]

相关问题 更多 >