Есть ли какой-либо метод сделать несколько кадров данных из файла XML с помощью дерева элементов? - PullRequest
1 голос
/ 11 ноября 2019
<root>  
 <person age="18">  
    <name>hzj</name>  
    <sex>man</sex>  
 </person>  
 <person age="19" des="hello">  
    <name>kiki</name>  
    <sex>female</sex>  
 </person>  
</root>
list=[]
for node in xroot.findall('./root/person'):
    name = node.attrib.get('name')
    sex = node.find('sex').text
    df=pd.DataFrame(columns=['person','name','sex']
list.append(df)

Я хочу, чтобы данные о возрасте 18 лет были одним кадром. 19 лет - это еще один датафрейм. Затем поместите эти 2 кадра данных в один список.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

Примерно так

import pandas as pd
import xml.etree.ElementTree as ET

xml = '''<root>  
 <person age="18">  
    <name>hzj</name>  
    <sex>man</sex>  
 </person>  
 <person age="19" des="hello">  
    <name>kiki</name>  
    <sex>female</sex>  
 </person>  
 <person age="19" des="hi">  
    <name>jane</name>  
    <sex>female</sex>  
 </person>   
</root>'''

data_frames = {}

root = ET.fromstring(xml)
for person in root.findall('.//person'):
  age = person.attrib['age']
  df = data_frames.get(age,None)
  if df is None:
    data_frames[age] = pd.DataFrame()
  data_frames[age]= data_frames[age].append({'name':person.find('./name').text,'sex':person.find('./sex').text},ignore_index=True)

for age,df in data_frames.items():
  print('{} --> {}'.format(age,df.head())) 

вывод

18 -->   name  sex
0  hzj  man
19 -->    name     sex
0  kiki  female
1  jane  female
0 голосов
/ 11 ноября 2019

Попробуйте это .. предположим, что ваш xml файл - file.xml.

import pandas as pd
import xml.etree.ElementTree as et 

xtree = et.parse("file.xml")
xroot = xtree.getroot()
dfar = {}
for node in xroot:
    age = node.attrib.get("age")
    dfar[f"{age}_df"]=pd.DataFrame()

for node in xroot:

    o_age = node.attrib.get("age")
    o_name = node.find("name").text
    o_sex = node.find("sex").text
    row = {"name":o_name,"sex":o_sex}
    df = dfar.get(f"{o_age}_df")
    dfar[f"{o_age}_df"] = df.append([row],ignore_index=True)


flist = list(dfar.items())
for i in flist:
    age = i[0]  
    df_of_age = i[1]
    df_of_age.to_csv(f"{age}.csv")
...