【问题标题】:Python CSV Comparison with multiplicationPython CSV与乘法比较
【发布时间】:2013-01-23 17:58:12
【问题描述】:

我想再次检查我的逻辑,了解如何在 Python 中将其组合在一起,因此非常感谢示例。

我需要比较 2 个 CSV 文件(格式完全相同,2 行 6 列)并提供差异。

我需要将第 2 行、第 2-6 列与特定值 (5) 相乘,然后分别合计,然后相互比较(CSV2 总计/CSV1 总计),并以百分比格式显示。

import csv 和 reader 似乎是要走的路,但对我来说棘手的部分是将其拉入一个列表,我可以将其与不同的值相乘(或者我应该使用一个集合?),然后在最简洁/有效的方式。

代码更新(基于第二个答案——太好了,谢谢!但现在调用我的行值整数时遇到错误):

import csv
file1 = open('csv1.csv', 'rb')
csv1 = csv.DictReader(file1)

file2 = open('csv2.csv', 'rb')
csv2 = csv.DictReader(file2)


myList = csv2.fieldnames
myList.append('Difference')

outFile = open('outFilename.csv', 'wb')
outCsv = csv.DictWriter(outFile, myList)

file1Dict = dict()
file2Dict = dict()

for row in file1:
    file1Dict[row['key value']]['Total1'] = {'Total1':(int(row[1]) * .75 + int(row[2]) * 2.25 + int(row[3]) * 3.5 + int(row[4]) * 5 + int(row[5]) * 25)}

for row in file2:
    file2Dict[row['key value']]['Total2'] = {'Total2':(int(row[1]) * .75, int(row[2]) * 2.25, int(row[3]) * 3.5, int(row[4]) * 5, int(row[5]) * 25)}

outFile.writeheader()

for stuff in file1Dict:
    file1Dict[stuff]['Difference'] = str(int(int(file1Dict[stuff]['Total2']) / int(file1Dict[stuff]['Total1'])) * 100) + '\%'
    outFile.writerow(file1Dict[stuff])

print 'difference'

【问题讨论】:

  • 欢迎来到 StackOverflow!为什么不显示到目前为止您尝试过的代码?
  • 如果您能看到示例输入和您所期望的输出,也会很高兴。
  • 这可能对你有帮助,help.hackshackers.com/questions/…

标签: python csv import percentage multiplication


【解决方案1】:

我认为您应该使用 Python Pandas 和内置的 read_csv 函数,因为这将非常有效,并将其放入一个矩形形式中,任何类型的数学运算都可以轻松应用并且易于在两个之间进行比较不同的导入数据集。

请注意,在导入pandas 之后,有一个全局级别read_csv,就像pandas.read_csv("/path/to/file.csv") 一样调用,而不需要像上面链接的文档页面中那样通过io.parsers

通过标准模块执行此操作并没有错;我只是觉得如果你打算做聚合或广播的数学运算,Pandas 提供的使用高效 NumPy 数学运算的矩形数组是最好的选择。

【讨论】:

  • Pandas 看起来很酷,虽然我收到了这个错误(python 和 Pandas 的 v 2.7):“Traceback(最近一次调用最后一次):文件“C:/Python27/budget”,第 1 行,在 中导入 pandas 文件“C:\Python27\lib\site-packages\pandas_init_.py”,第 6 行,在 中 from .import hashtable, tslib, lib 文件“ tslib.pyx",第 25 行,在 init pandas.tslib (pandas\tslib.c:37082) ImportError: No module named dateutil.parser"
  • 这似乎是您的系统特有的,我使用的是 Python 2.7.3(另外,Pandas 没有 2.7 版本,所以我不确定您指的是哪个版本.. 做你的意思是 0.2.7?如果是这样,那太旧了,你不太可能使用它,因为你实际上必须不遗余力地获得这么旧的版本)。对我来说,dateutil.parser 是我可以导入的有效模块。
  • 感谢您的提示!我确定我只是有错误的版本。 :) 很高兴能更多地探索熊猫。
【解决方案2】:
import csv
file1 = open('filename1.csv', 'rb')
csv1 = csv.DictReader(file1)

file2 = open('filename2.csv', 'rb')
csv2 = csv.DictReader(file2)


myList = csv2.fieldnames
myList.append('Total1','Total2', 'Difference')

outFile = open('outFilename.csv', 'wb')
outCsv = csv.DictWriter(outFile, myList)

file1Dict = dict()
file2Dict = dict()

for rows in file1:
    file1Dict[rows['key value']] = {rows[0], rows[1], 'Total1':int(rows[1]) * 5}

for rows in file2:
    file1Dict[rows['key value']]['Total2'] = {'Total2':int(rows[1]) * 5}

outFile.writeheader()

for stuff in file1Dict:
    file1Dict[stuff]['Difference'] = str(int(int(file1Dict[stuff]['Total2']) / int(file1Dict[stuff]['Total1'])) * 100) + '\%'
    outFile.writerow(file1Dict[stuff])

只是您所描述的内容的快速组合,没有非标准模块。

【讨论】:

  • 谢谢!实际上,我将课程切换到您的建议,因为我真的很喜欢它,并进行了一些更新(每个数字都需要乘以不同的值)。当我应该在 csv 中点击整数时,我现在收到错误“invalid literal for int() with base 10: 'e'”。想法?上面更新了代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多