如何在Pandas数据框的列内添加空白单元格?

问题描述 投票:0回答:1

我是Python的初学者,并通过Pandas使用数据框。我正在尝试使用xml.dom.minidom从XML文件中提取表格到Excel文件中。这就是原始表的外观(请注意“ Bike”下的黑色条目):

VEHICLE   BRAND
Car       Mercedes
Bike      Kawasaki
          Ducati
Truck     Ram

我正在尝试从给定的XML文件中提取该表:

<Info_Collection>
    <Info car="Car">
        <V_Collection>
            <Brand type="Mercedes"/>
        </V_Collection>
    </Info>
    <Info car="Bike">
        <V_Collection>
            <Brand type="Kawasaki"/>
            <Brand type="Ducati"/>
        </V_Collection>
    </Info>
    <Info car="Truck">
        <V_Collection>
            <Brand type="Ram"/>
        </V_Collection>
    </Info>
</Info_Collection>

这是我正在使用的代码:

def main():
  x1=[]
  x2=[]
  doc = xml.dom.minidom.parse('xml_file')
  t1 = doc.getElementsByTagName("Info")
  t2 = doc.getElementsByTagName("Brand")
  for a in t1:
     x1.append(tb.getAttribute("car"))
  for a in t2:
     x2.append(tb.getAttribute("type"))
  while len(x1) != len(x2): 
     x1.append("")
  boDF = pd.DataFrame({'VEHICLE': x1, 'BRAND':x2})
  boDF.to_excel(writer, sheet_name='Sheet1', index=0, startrow=1)
  writer.save()

if __name__ == "__main__":
  main()

运行后,输出表如下:

VEHICLE   BRAND
Car       Mercedes
Bike      Kawasaki
Truck     Ducati
          Ram

有人可以帮助我找出如何在“自行车”和“卡车”之间插入空格吗?我尝试同时运行两个for循环,并比较它们的长度,以查看它们是否相等,如果不相等,则会在第一列中添加一个空格。但是,我无法使其正常工作。我知道我的代码中的while循环在第一列的末尾添加了一个空格,但是我不知道如何在列内添加任何内容。

python xml pandas dataframe xml-parsing
1个回答
0
投票

请参见下文。

想法是创建一个通常与Excel关联的csv文件。 XML解析是通过内置的python XML解析库'ElementTree'完成的。当您双击csv文件时,通常它将由Excel打开,您将获得所需的表。

注意您发布的XML不是有效的XML,必须予以修复(v_Collection与V_Collection)

import xml.etree.ElementTree as ET

xml = '''<Info_Collection>
    <Info car="Car">
        <V_Collection>
            <Brand type="Mercedes"/>
        </V_Collection>
    </Info>
    <Info car="Bike">
        <V_Collection>
            <Brand type="Kawasaki"/>
            <Brand type="Ducati"/>
        </V_Collection>
    </Info>
    <Info car="Truck">
        <V_Collection>
            <Brand type="Ram"/>
        </V_Collection>
    </Info>
</Info_Collection>'''

data = [['VEHICLE', 'BRAND']]
root = ET.fromstring(xml)
info_list = root.findall('.//Info')
cars = set()
for info_entry in info_list:
    car = info_entry.attrib['car']
    for brand in [brand.attrib['type'] for brand in info_entry.findall('.//Brand')]:
        data.append([car if car not in cars else '', brand])
        cars.add(car)
with open('cars.csv', 'w') as out:
    for entry in data:
        out.write(','.join(entry) + '\n')

输出(cars.csv)

VEHICLE,BRAND
Car,Mercedes
Bike,Kawasaki
,Ducati
Truck,Ram
© www.soinside.com 2019 - 2024. All rights reserved.