【问题标题】:How do I add a blank cell inside a column of a Pandas dataframe?如何在 Pandas 数据框的列中添加空白单元格?
【发布时间】:2020-03-30 16:57:12
【问题描述】:

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

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 循环在第一列的末尾添加了一个空格,但我不知道如何在列内的任何位置添加。

【问题讨论】:

  • 感谢您的评论,但是,这些链接仅显示如何从 XML 文件创建数据框。它没有解释如何在列之间添加空格。
  • 您使用 minidom 有什么原因吗?您是否检查过程序中各个步骤的数据? ericlippert.com/2014/03/05/how-to-debug-small-programs我也很好奇你为什么要留一个空白单元格。
  • 我使用 minidom 是因为我从在线课程中学到的。我还没有尝试使用任何其他方式来提取文件。是的,我已经检查了代码如何在方法的各个部分运行,但无法创建解决此问题的解决方案(不确定我是否正在回答问题,但我会查看链接并尝试实施提示。)添加空白单元格的重点是,当您阅读 excel 文件时,每个单元格都与其对应的单元格对齐。 (根据上表:杜卡迪制造自行车,而不是卡车。因此,“卡车”单元应向下移动一个单元。)

标签: python xml pandas dataframe xml-parsing


【解决方案1】:

见下文。

这个想法是创建一个通常与 Excel 关联的 csv 文件。 XML 解析由内置的 python XML 解析库“ElementTree”完成。当你双击 csv 文件时,它通常会被 Excel 打开,你会得到你正在寻找的表格。

注意您发布的 XML 不是有效的 XML,必须修复(v_Collection Vs 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

【讨论】:

  • 感谢您的回复!对于 xml 文件中的错误,我深表歉意。但是,我认为我无法使用此代码,因为这只是整个 xml 文件的一小部分,而且我知道有一种方法可以直接扫描 xml 文件。但是,我正在寻找一种通过 minidom 做到这一点的方法。我可能会将每一行输出到一个单独的数据框中。不过谢谢!
  • 可以修改此代码并改为读取文件 (tree = ET.parse('my_file.xml'))。所以你可以毫无问题地使用它:-)
猜你喜欢
  • 2019-03-17
  • 2019-10-01
  • 1970-01-01
  • 2018-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多