【问题标题】:Parsing XML data into pandas multiindex dataframe将 XML 数据解析为 pandas 多索引数据帧
【发布时间】:2019-08-17 07:39:41
【问题描述】:

我想将 XML 文件中的数据解析为多索引 pandas 数据框。我的 XML 文件如下所示:

<?xml version="1.0"?>
<catalog>
   <book name="Documents/Books/German">
      <author>Kerstin Gier</author>
      <title>Rubinrot</title>
   </book>
   <book name="Documents/Articles/English">
      <author>Kim Ralls</author>
      <title>Midnight Rain</title>
   </book>
   <book name="Documents/Books/English">
      <author>Eva Corets</author>
      <title>Maeve Ascendant</title>
   </book>
   <book name="Documents/Books/English">
      <author>Karl Parker</author>
      <title>Worldeater</title>
   </book>
</catalog>

我们的目标是将所有书籍标签中的数据存储到一个多索引 pandas 数据框中,如下所示:

                              author        title   
Documents  Books     German   Kerstin Gier  Rubinrot        
                     English  Eva Corets    Maeve Ascendant
                              Karl Parker   Worldeater
           Articles  German   Null          Null
                     English  Kim Ralls     Midnight Rain

多索引数据框的索引应该是属性“名称”包含的路径。我不想硬编码任何路径,因为我的真实示例有许多不同的路径,并且多索引数据框将有 5-6 个维度。

到目前为止我的方法: 我开始创建一个看起来像这样的单个索引数据框

path                        author        title 
Documents/Books/German      Kerstin Gier  Rubinrot
Documents/Articles/English  Kim Ralls     Midnight Rain
Documents/Books/English     Eva Corets    Maeve Ascendant
Documents/Books/English     Karl Parker   Worldeater

问题是:如何将数据帧转换为以路径结构为索引的多索引数据帧?我看到的问题是在不丢失与数据的绑定的情况下更改索引。

【问题讨论】:

  • 不,我需要一个生成多索引数据帧的解决方案。这(据我所知)更复杂。不过感谢您的建议。这是一个很好的备份解决方案。
  • 这样解析不可以,事后创建多索引?
  • 这可能是一个选项。我编辑了我的问题。感谢您迄今为止的帮助!
  • 根据编辑回答

标签: python xml pandas xml.etree


【解决方案1】:

根据您的原始问题和编辑,这是后续解决方案。使用here的解析,以及here的思路:

我们采用现有的路径列,将其拆分为 / 并将其转换为列表,然后使用这些列表值创建新列。

然后我们将这些列用作新索引。

df

    path                    author          title
0   Documents/Books/German  Kerstin_Gier    Rubinrot
1   Documents/Articles/English  Kim_Ralls   Midnight_Rain
2   Documents/Books/English Eva_Corets  Maeve_Ascendant
3   Documents/Books/English Karl_Parker Worldeater

df[['cat','type','lang']]=pd.DataFrame(df['path'].str.split('/').values.tolist(), index=df.index)

df

    path                    author          title       cat         type    lang
0   Documents/Books/German  Kerstin_Gier    Rubinrot    Documents   Books   German
1   Documents/Articles/English  Kim_Ralls   Midnight_Rain   Documents   Articles    English
2   Documents/Books/English Eva_Corets  Maeve_Ascendant Documents   Books   English
3   Documents/Books/English Karl_Parker Worldeater  Documents   Books   English

df.set_index(['cat','type','lang'])

                                path                    author          title
cat         type        lang            
Documents   Books       German  Documents/Books/German  Kerstin_Gier    Rubinrot
            Articles    English Documents/Articles/English  Kim_Ralls   Midnight_Rain
            Books       English Documents/Books/English Eva_Corets  Maeve_Ascendant
                        English     Documents/Books/English Karl_Parker Worldeater

从那里,如果需要,显然您可以drop 路径

【讨论】:

  • 没问题,乐于助人!
  • @G.Anderson - 你能解释一下为什么当cat 是一个列时,它有4 个条目——全部是Documents;一旦set_index 将其设为索引,它只有一个,其他三个留空。 type 列也是如此,它作为索引有一个空白。
  • @JackFleeting 这是 pandas 中多索引的默认显示。因为其他值只是初始值的重复,所以不显示它们
  • @JackFleeting 这个,老实说,这只是 它的显示方式。单个索引(或者,在这种情况下,多索引的最后一层)的默认设置是显示所有值。如果您检查第二个和第三个索引中的值,您会发现它们是重复的,因为它们都是不同的组合。 [(Books, German),(Articles, English),(Books, English),(Books, English)]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-10
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多