Синтаксический анализ XML-данных в мультииндексном фрейме Pandas. - PullRequest
1 голос
/ 26 марта 2019

Я хочу проанализировать данные из 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>

Цель состоит в том, чтобы сохранить данные из всех тегов книги в мультииндексном панде, который должен выглядеть следующим образом:

                              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

Вопрос: как я могу преобразовать фрейм данных в мультииндексный фрейм данных со структурой пути в виде индексов? Проблема, которую я вижу, заключается в изменении индексов без потери привязки к данным.

1 Ответ

1 голос
/ 27 марта 2019

Исходя из ваших оригинальных вопросов и правок, вот дальнейшее решение.Используя синтаксический анализ здесь и идеи здесь :

Мы берем существующий столбец пути, разбиваем его на / и преобразуем в список,затем используйте эти значения списка для создания новых столбцов.

Затем мы используем эти столбцы в качестве нового индекса.

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 путь, если хотите

...