2016-04-25 4 views
-1

私は比較的Pythonに新しいです。先月から "data_old"と呼ばれるCSVファイルを見て、それを "data_new"というより最近の月のデータと比較し、最後にそのデータを新しいCSV "data_compare"。csvの行を比較し、ワークアウトの割合をパーセント

ファイルの各月を一貫してレイアウトし、この(例)のように見えている

月1
会社、StaffNumber、NeedToPass、合格、%年齢会議の要件
XXXXXXXX、100、80、30 30%

月3
社StaffNumber、NeedToPass、合格、%会議要件
XXXXXXXX、101、81、54、60%

出力ファイルを取得して、すべての行のデータを比較しようとしています。「Percentage meeting requirements」の代わりに「Percentage improvements」を表示しています。私が試してみるものは何もないようです。

数字が常に変わるので、一般的なデータは会社名のみになります。

私はコメントを使って簡単な説明的な方法が必要です...ロジックを理解したいので、私はそれを変更して機能を追加することができます。

非常に高く評価されています。

+0

したがって、最初の1つ(一意の会社名)以外のすべての列には整数が含まれていますか? –

+0

はい、そうです – glister11

答えて

0

ここでは、あなたが望むことができるpythonコードの例です。このスクリプトは、2つの入力csvファイルの行数が同じであることを示しています。関数testでは、関数zipが使用されました。これは、1つのリストが最後にある場合に停止します。ファイルの行数が異なる場合は、手動で両方をループバックする必要があります。しかし、私はそれが良い出発点だと思う。

#!/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() 
関連する問題