XML到pandas:导出到CSV并使儿童在同一行

我正处于“酝酿阶段”,试图用pandas将XML文件转换为csv。 我终于做了与代码波纹pipe:

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') 

这是XML文件:

 <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> 

这是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 A 20160119 203000 

我想要的只是将这些数据放在“MARCA_EQUIPAMENTO”列之后的同一行中,但正如您所看到的,这就像是一个“形状的阶梯行”。 有什么我可以做的pandas或擅长修复,并在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 A 20151218 83800 102 30806746 16925 1 S 1 1 5 kWh 1 1 A 20160119 203000

考虑在iterparse()运行条件。 因为<NOME_DISTRITO><NR_CPE>位于重复的<LEITURA>元素之外,所以将它们的值保存为标量以添加到inner{}字典中以附加到数据框:

 import xml.etree.ElementTree as et import pandas as pd path ='/path/to/Input.xml' data = [] for (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 for i 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 A 1 083800 # 1 20160119 A 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