【问题标题】:Compare rows of csv and work out percentage比较 csv 行并计算百分比
【发布时间】:2016-04-25 11:23:51
【问题描述】:

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

每个月的文件布局一致,看起来像这样(示例)

第 1 个月
公司、员工人数、NeedToPass、通过、满足要求的百分比
xxxxxxxx, 100, 80, 30, 30%

第 3 个月
公司、StaffNumber、NeedToPass、Pass、%满足要求
xxxxxxxx, 101, 81, 54, 60%

我正在尝试获取输出文件以比较所有行的数据,并向我显示“百分比提高,而不是“百分比满足要求”。我尝试的任何方法似乎都不起作用。

随着数字一直在变化,唯一的通用数据将是公司名称。

我需要一个简单的、解释性的 cmets 方法……因为我想了解逻辑,以便修改它并添加功能。

非常感谢。

【问题讨论】:

  • 那么除了第一列(唯一的公司名称)之外的所有列都包含整数?

标签: python csv compare


【解决方案1】:

这是一个 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()

【讨论】:

    猜你喜欢
    • 2011-06-01
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 2022-12-05
    • 1970-01-01
    • 2015-10-11
    相关资源
    最近更新 更多