比较csv行并计算百分比

2024-09-29 23:17:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python比较陌生。我试图找到一种方法来创建一个脚本,该脚本查看上个月名为“data_old”的CSV文件,并将其与最近一个月名为“data_new”的数据进行比较,然后最终将该数据输出到一个新的CSV“data_compare”。在

每个月的文件都是一致的,如下所示(示例)

Month 1
Company, StaffNumber, NeedToPass, Passed, %age meeting requirement
xxxxxxxx, 100, 80, 30, 30%

Month 3
Company, StaffNumber, NeedToPass, Passed, %meeting requirement
xxxxxxxx, 101, 81, 54, 60%

我试图让输出文件比较所有行的数据并显示“改进的百分比”,而不是“满足要求的百分比”。我所尝试的似乎都不管用。在

由于数字一直在变化,唯一常见的数据将是公司名称。在

我需要一个简单,解释的方式与评论。。。因为我想理解逻辑,所以我可以修改它并添加函数。在

非常感谢。在


Tags: 文件csv数据脚本datarequirementcompany百分比
1条回答
网友
1楼 · 发布于 2024-09-29 23:17:07

下面是一个python代码示例,它可以满足您的需要。这个脚本计算两个输入csv文件的行数相同。在函数test中,我使用的函数zip,如果最后有一个列表,它将停止。如果文件的行数不同,则必须手动循环两行。但我认为这是一个很好的起点

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import csv


def parse_csv(filename, sort_row=0, as_dict=False, delimiter=","):
    r = list()
    with open(filename, "rb") as f:
        # make csv reader object
        reader = csv.reader(f, delimiter=delimiter)

        if as_dict:
            # make dict if desired
            header = [h.strip() for h in reader.next()]

        for row in reader:
            if as_dict:
                # make dict if desired
                r.append(dict(zip(header, row)))
            else:
                # strip each item in the row and append it to the return list
                r.append([h.strip() for h in row])

    # sort the list by the first item (company name in this example)
    r.sort(key=lambda x: x[sort_row])
    return r


def write_csv(filename, fieldnames, rows, delimiter=","):
    with open(filename, "w") as f:
        # make csv writer object
        writer = csv.writer(f, delimiter=delimiter)
        # write the first header line
        writer.writerow(fieldnames)
        for row in rows:
            # write each row
            writer.writerow(row)


def test():
    data_old = parse_csv("m1.csv")
    data_new = parse_csv("m2.csv")
    #write_csv("data_compare.csv", data_old[:1][0], data_old[1:])

    result = list()

    # loop over the items (skipping the first header row)
    for o, n in zip(data_old[1:], data_new[1:]):
        # calculate the improvement (or whatever needs to be calculated)
        value = float(n[4].replace("%", "")) - float(o[4].replace("%", ""))

        # create the row
        result.append([o[0], "%s%%" % value, o[4], n[4]])
        #result.append(["%s%%" % value])

    header = ["Company", "Percentage improved", "old", "new"]
    #header = ["Company", "Percentage improved"]
    write_csv("data_compare.csv", header, result)


if __name__ == '__main__':
    test()

相关问题 更多 >

    热门问题