【问题标题】:Explode XML string column into multiple rows将 XML 字符串列分解为多行
【发布时间】:2021-08-09 10:06:25
【问题描述】:

我正在使用具有多个 XML 字符串列的数据框。 XML 字符串具有以下结构。

<row>
     <group>
            <date>2021-12-25</date>  
            <ind1>50</ind1>
            ...
            <indN>10</indN>
     </group>
     ...
     <group>
            <date>2021-12-31</date> 
            <ind1>28</ind1>
            ...
            <indN>13</indN>
     </group>
</row>

数据框的结构如下:

id     name     indicators                               
1     John     '<?xml version="1.0"?>\n<row>\n  <group>\n    <date>2021-12-25</date> ...'
1     John     '<?xml version="1.0"?>\n<row>\n  <group>\n    <date>2021-12-31</date> ...'                     
...

我想分解 XML 字符串,以便它为每个指标创建一个列。我想要一些看起来像下面的数据框的东西。

id     name     date          ind1        ...     indN                               
1     John     2021-12-25     50          ...     10     
1     John     2021-12-31     28          ...     13
...

这就是数据框的样子

df.head(2).to_dict()
>> {'KEY': {0: 1,
  1: 2},
 'INDICATORS': {0: '<?xml version="1.0"?>\n<row>\n  <group>\n    <date>2017-12-31</date>\n    <ind1>14</ind1>\n    <ind2>24</ind2>\n  </group>\n  <group>\n    <date>2015-12-31</date>\n    <ind1>10</ind1>\n    <ind2>20</ind2>\n </group>\n  <group>\n    <date>2016-12-31</date>\n    <ind1>12</ind1>\n    <ind2>22</ind2>\n  </group>\n</row>\n',
  1: '<?xml version="1.0"?>\n<row>\n  <group>\n    <date>2017-12-31</date>\n    <ind1>0</ind1>\n    <ind2>0</ind2>\n  </group>\n  <group>\n    <date>2015-12-31</date>\n    <ind1>0</ind1>\n    <ind2>0</ind2>\n  </group>\n  <group>\n    <date>2016-12-31</date>\n    <ind1>0</ind1>\n    <ind2>0</ind2>\n </group>\n</row>\n'}}

你有什么想法吗?

【问题讨论】:

  • pd.read_xml(data) 怎么样,但是你需要更新 pandas [链接](pandas.pydata.org/pandas-docs/dev/whatsnew/…)
  • 你尝试了什么?请发布更好的数据框格式,尝试df.head(2).to_dict() 并将输出粘贴到您的帖子中。
  • 可以用beautifulsoup解析吗?
  • 我不认为它是重复的。就我而言,我的数据框的每一行都对应一个分配了特定id 的实体。对于每个实体/ID,我需要为每组指标创建一行。在您所说的可能重复中,XML 是一个文件,而不是 Dataframe 中的一列。

标签: python pandas xml dataframe


【解决方案1】:

我认为最好的方法是从数据框中提取 xml,正确解析,提取目标数据并重新创建数据框。有几种方法可以做到这一点;其中之一涉及在 pandas 中使用新的 read_xml() 方法,但是(正如您稍后将看到的),这是一个多索引数据框,我没有设法让它在这种特定情况下工作。也许其他人可以...无论如何,以下内容至少应该使您与实际所需的输出足够接近。

df.head(2).to_dict()的输出开始:

from lxml import etree
#convert to dictionary (you probably don't need to do it)
target = """your output above, type dict""
rows = []

for val in target[ 'INDICATORS'].values():
    #extract the xml and parse it
    doc = etree.XML(val)
    #your sample xml has 3 groups each of which needs to be handled separately
    groups = doc.xpath('//row//group')
    row = []
    for group in groups:
        row.extend(group.xpath('./*/text()'))
    rows.append(row)

现在您已经拥有列表列表中的数据,是时候重新创建数据框了:

columns = pd.MultiIndex.from_product([['Group1', 'Group2', 'Group3'], ['Date', 'Ind1', 'Ind2']],
                                     names=['Group', 'data'])
df = pd.DataFrame(rows, columns=columns)
df

输出(请原谅格式):

Group   Group1                  Group2                  Group3
data    Date       Ind1 Ind2 Date   Ind1    Ind2   Date       Ind1  Ind2
0       2017-12-31  14  24   2015-12-31     10  20  2016-12-31  12  22
1       2017-12-31  0   0    2015-12-31     0   0   2016-12-31  0   0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多