¿Cómo crear Pandas DataFrame a partir de XML anidado?

En este artículo, aprenderemos cómo crear Pandas DataFrame a partir de XML anidado. Usaremos el módulo xml.etree.ElementTree , que es un módulo incorporado en Python para analizar o leer información del archivo XML. ElementTree representa el documento XML como un árbol y Element representa solo un Node del árbol.

Funciones utilizadas:

Aquí, usaremos algunas funciones para procesar el código que se indica a continuación:

  • ElementTree.parse (archivo XML): para leer datos de un archivo XML
  • root.iter(‘root_name’): para iterar a través de las ramas del Node raíz
  • ElementTree.fromstring (XML_file): para leer datos cuando el código XML se pasa como una string dentro de comillas triples en el código python
  • prstree.findall(‘store’): Para encontrar todos los elementos del XML ElementTree analizado
  • node.attribute.get(attribte_name ): para obtener el atributo
  • node.find(attribte_name): para recuperar el contenido de texto del atributo_name mencionado
  • pandas.DataFrame() : Para convertir los datos XML a un DataFrame
  • list.append() : Para agregar los elementos a una lista

Acercarse

  • Analice o lea el archivo XML utilizando la función ElementTree.parse( ) y obtenga el elemento raíz.
  • Iterar a través del Node raíz para obtener los atributos de los Nodes secundarios ‘SL NO’ (aquí) y extraer los valores de texto de cada atributo (aquí alimento, precio, cantidad y descuento).
  • Obtenga los alimentos respectivos con especificaciones como una unidad adjunta a una lista (aquí lista all_items()).
  • Convierta la lista en un DataFrame usando la función pandas.DataFrame() y mencione los nombres de las columnas entre comillas separadas por comas.
  • Imprime el DataFrame y listo.

Entrada de datos XML anidados

XML

<?xml version="1.0" encoding="UTF-8"?>
  
       <Food>
  
           <Info>
           <Msg>Food Store items.</Msg>
           </Info>
  
           <store slNo="1">
               <foodItem>meat</foodItem>
               <price>200</price>
               <quantity>1kg</quantity>
               <discount>7%</discount>
           </store>
  
           <store slNo="2">
               <foodItem>fish</foodItem>
               <price>150</price>
               <quantity>1kg</quantity>
               <discount>5%</discount>
           </store>
  
           <store slNo="3">
               <foodItem>egg</foodItem>
               <price>100</price>
               <quantity>50 pieces</quantity>
               <discount>5%</discount>
           </store>
  
           <store slNo="4">
               <foodItem>milk</foodItem>
               <price>50</price>
               <quantity>1 litre</quantity>
               <discount>3%</discount>
           </store>
  
       </Food>

Ejemplo 1:

En este código a continuación hemos analizado el archivo XML. Proporcione la ruta completa donde guardó el archivo XML entre comillas. Así que aquí necesitamos usar la función ElementTree.parse() para leer los datos del archivo XML y luego la función getroot() para obtener la raíz. Luego siga los pasos dados.

Python3

import xml.etree.ElementTree as ETree
import pandas as pd
  
# give the path where you saved the xml file
# inside the quotes
xmldata = "C: \\ProgramData\\Microsoft\\
    Windows\\Start Menu\\Programs\\
    Anaconda3(64-bit)\\xmltopandas.xml"
prstree = ETree.parse(xmldata)
root = prstree.getroot()
  
# print(root)
store_items = []
all_items = []
  
for storeno in root.iter('store'):
    
    store_Nr = storeno.attrib.get('slNo')
    itemsF = storeno.find('foodItem').text
    price = storeno.find('price').text
    quan = storeno.find('quantity').text
    dis = storeno.find('discount').text
  
    store_items = [store_Nr, itemsF, price, quan, dis]
    all_items.append(store_items)
  
xmlToDf = pd.DataFrame(all_items, columns=[
  'SL No', 'ITEM_NUMBER', 'PRICE', 'QUANTITY', 'DISCOUNT'])
  
print(xmlToDf.to_string(index=False))

Producción:

Nota : el archivo XML debe guardarse en el mismo directorio o carpeta donde guardó su código de Python.

Ejemplo 2:

También podemos pasar el contenido XML como una string entre comillas triples. En ese caso, necesitamos usar la función fromstring() para leer la string. Obtenga la raíz usando el objeto ‘etiqueta’ y siga los mismos pasos para convertirlo en un DataFrame como se mencionó anteriormente.

Python3

import xml.etree.ElementTree as ETree
import pandas as pd
  
xmldata = '''<?xml version="1.0" encoding="UTF-8"?>
        <Food>
            <Info>
            <Msg>Food Store items.</Msg>
            </Info>
            <store slNo="1">
                <foodItem>meat</foodItem>
                <price>200</price>
                <quantity>1kg</quantity>
                <discount>7%</discount>
            </store>
            <store slNo="2">
                <foodItem>fish</foodItem>
                <price>150</price>
                <quantity>1kg</quantity>
                <discount>5%</discount>
            </store>
            <store slNo="3">
                <foodItem>egg</foodItem>
                <price>100</price>
                <quantity>50 pieces</quantity>
                <discount>5%</discount>
            </store>
            <store slNo="4">
                <foodItem>milk</foodItem>
                <price>50</price>
                <quantity>1 litre</quantity>
                <discount>3%</discount>
            </store>
        </Food>
'''
  
prstree = ETree.fromstring(xmldata)
root = prstree.tag
  
#print(root)
store_items = []
all_items = []
  
for storeno in prstree.findall('store'):  
    store_Nr = storeno.attrib.get('slNo')
    itemsF= storeno.find('foodItem').text
    price= storeno.find('price').text
    quan= storeno.find('quantity').text
    dis= storeno.find('discount').text
          
    store_items = [store_Nr,itemsF,price,quan,dis]
    all_items.append(store_items)
  
xmlToDf = pd.DataFrame(all_items,columns=[
  'SL No','ITEM_NUMBER','PRICE','QUANTITY','DISCOUNT'])        
  
print(xmlToDf.to_string(index=False))

Producción:

Publicación traducida automáticamente

Artículo escrito por rijushree100guha y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *