python - XML to pandas: Export to csv and make the childrens in same row -
i in "munging stage", trying convert xml file csv pandas. did code bellow:
for element in etree.iterparse(path): data.append({element.tag: element.text}) df = pd.dataframe(data,columns=['nome_distrito', 'nr_cpe', 'marca_equipamento', 'nr_equipamento','valor_leitura','registador', 'tipo_registador','tipo_dados_recolhidos','factor_multiplicativo_final', 'nr_digitos_inteiro','unidade_medida','tipo_leitura','motivo_leitura', 'estado_leitura','data_leitura','hora_leitura']) df.to_csv('/lecture.csv')
this xml file:
<distrito xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"> <nome_distrito>braganca</nome_distrito> <cpe> <nr_cpe>pt000200003724</nr_cpe> <leitura> <marca_equipamento>102</marca_equipamento> <nr_equipamento>30806746</nr_equipamento> <valor_leitura>16858</valor_leitura> <registador>001</registador> <tipo_registador>s</tipo_registador> <tipo_dados_recolhidos>1</tipo_dados_recolhidos> <factor_multiplicativo_final>1</factor_multiplicativo_final> <nr_digitos_inteiro>5</nr_digitos_inteiro> <unidade_medida>kwh</unidade_medida> <tipo_leitura>2</tipo_leitura> <motivo_leitura>2</motivo_leitura> <estado_leitura>a</estado_leitura> <data_leitura>20151218</data_leitura> <hora_leitura>083800</hora_leitura> </leitura> <leitura> <marca_equipamento>102</marca_equipamento> <nr_equipamento>30806746</nr_equipamento> <valor_leitura>16925</valor_leitura> <registador>001</registador> <tipo_registador>s</tipo_registador> <tipo_dados_recolhidos>1</tipo_dados_recolhidos> <factor_multiplicativo_final>1</factor_multiplicativo_final> <nr_digitos_inteiro>5</nr_digitos_inteiro> <unidade_medida>kwh</unidade_medida> <tipo_leitura>1</tipo_leitura> <motivo_leitura>1</motivo_leitura> <estado_leitura>a</estado_leitura> <data_leitura>20160119</data_leitura> <hora_leitura>203000</hora_leitura> </leitura> </cpe>
and final result in excel:
nome_distrito nr_cpe marca_equipamento nr_equipamento valor_leitura registador tipo_registador tipo_dados_recolhidos factor_multiplicativo_final nr_digitos_inteiro unidade_medida tipo_leitura motivo_leitura estado_leitura data_leitura hora_leitura braganca
pt000200003724 102 30806746 16925 1 s 1 1 5 kwh 1 1 20160119 203000
all want have data in same row after column "marca_equipamento", can see "shape staircase row". there can pandas or excel fix , have in nice manner in excel?
nome_distrito nr_cpe marca_equipamento nr_equipamento valor_leitura registador tipo_registador tipo_dados_recolhidos factor_multiplicativo_final nr_digitos_inteiro unidade_medida tipo_leitura motivo_leitura estado_leitura data_leitura hora_leitura braganca
pt0002000021673724je
102 30806746 16858 1 s 1 1 5 kwh 2 2 20151218 83800 102 30806746 16925 1 s 1 1 5 kwh 1 1 20160119 203000
consider running conditionals in iterparse()
. because <nome_distrito>
, <nr_cpe>
lie outside repeated <leitura>
elements, save values in scalars added inner{}
dictionary appending dataframe:
import xml.etree.elementtree et import pandas pd path ='/path/to/input.xml' data = [] (ev, el) in et.iterparse(path): if el.tag == 'nome_distrito': nome = el.text if el.tag == 'nr_cpe': nr = el.text if el.tag == "leitura": inner = {} inner['nome_distrito'] = nome inner['nr_cpe'] = nr in el: inner[i.tag] = i.text data.append(inner) df = pd.dataframe(data) print(df) # data_leitura estado_leitura factor_multiplicativo_final hora_leitura \ # 0 20151218 1 083800 # 1 20160119 1 203000 # marca_equipamento motivo_leitura nome_distrito nr_cpe \ # 0 102 2 braganca pt000200003724 # 1 102 1 braganca pt000200003724 # nr_digitos_inteiro nr_equipamento registador tipo_dados_recolhidos \ # 0 5 30806746 001 1 # 1 5 30806746 001 1 # tipo_leitura tipo_registador unidade_medida valor_leitura # 0 2 s kwh 16858 # 1 1 s kwh 16925
Comments
Post a Comment