【问题标题】:Adding a counter as index of the Dataframe添加一个计数器作为数据框的索引
【发布时间】:2020-01-27 18:15:10
【问题描述】:

下面的代码获取一个包含 xml 文件的文件夹并将它们解析为单个 csv 文件。 它确实做得很好。

from xml.etree import ElementTree as ET
from collections import defaultdict
import csv
from pathlib import Path

directory = 'C:/Users/docs/FolderwithXMLs'

with open('output.csv', 'w', newline='') as f:
    writer = csv.writer(f)

    headers = ['id', 'service_code', 'rational', 'qualify', 'description_num', 'description_txt', 'set_data_xin', 'set_data_xax', 'set_data_value', 'set_data_x']

    writer.writerow(headers)

    xml_files_list = list(map(str,Path(directory).glob('**/*.xml')))
    for xml_file in xml_files_list:
        tree = ET.parse(xml_file)
        root = tree.getroot()

        start_nodes = root.findall('.//START')
        for sn in start_nodes:
            row = defaultdict(str)


            for k,v in sn.attrib.items():
                row[k] = v

            for rn in sn.findall('.//Rational'):
                row['rational'] = rn.text

            for qu in sn.findall('.//Qualify'):
                row['qualify'] = qu.text

            for ds in sn.findall('.//Description'):
                row['description_txt'] = ds.text
                row['description_num'] = ds.attrib['num']


            for st in sn.findall('.//SetData'):
                for k,v in st.attrib.items():
                    row['set_data_'+ str(k)] = v
                row_data = [row[i] for i in headers]
                writer.writerow(row_data)
                row = defaultdict(str)

输出如下所示

我一直在尝试为该特定 ID 的 set_data_value 行数添加一个计数器。 输出应该是这样的

如有必要,我也可以提供 xml 数据。很抱歉,有人必须编辑问题以显示图片,而不仅仅是宣传链接

我已经检查了这里的其他帖子,但我无法在此代码中实现

【问题讨论】:

  • 可能df.groupby('id').cumcount(). 虽然你可能首先需要做df['id'] = df['id'].ffill()
  • @ALollz,如果您能给出答案并编辑我的问题以显示图片,那么它对可能遇到相同问题的其他用户很有帮助。非常感谢
  • @ALollz 感谢您编辑问题。你能帮我解决这个问题吗?如果有必要我也可以放 xml 文件

标签: python pandas csv counter


【解决方案1】:

如果没有看到 XML,猜测会有点麻烦,但是如果您将“计数器”添加到 headers,然后在最后一个 for 循环中添加枚举,它可能会起作用

            for counter, st in enumerate( sn.findall('.//SetData') ):
                for k,v in st.attrib.items():
                    row['set_data_'+ str(k)] = v
                row["Counter"] = counter 
                row_data = [row[i] for i in headers]
                writer.writerow(row_data)
                row = defaultdict(str)

【讨论】:

  • 你能在这里看看这个问题吗?它与您在这里帮助我的代码相同。非常感谢Question
猜你喜欢
  • 2019-09-30
  • 1970-01-01
  • 2013-10-16
  • 2019-01-16
  • 2018-08-24
  • 2021-09-23
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多