如果在csv中依赖计算并替换主csv中的值

时间:2013-10-02 16:58:12

标签: python csv python-2.7 division multiplication

我有3个csvs,两个包含“类”列表,另一个包含我的主数据集,如果第2列中的数据出现在列表csv 1中,我需要我的代码执行一次计算,但执行不同的操作计算第2列中的数据是否出现在列表csv 2中并覆盖主csv列12中的值:

让我们假设列表csv 1包含以下内容:

classA

并列出csv 2

classB
classC

我的主要数据列表包含以下内容:

X,classA,uniqueclassindicator1,x,x,3,x,x,x,x,125,21.8,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator1,x,x,3,x,x,x,x,125,21.8,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator1,x,x,3,x,x,x,x,125,21.8,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classB,uniqueclassindicator2,x,x,4,x,x,x,x,125,21.8,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classB,uniqueclassindicator2,x,x,4,x,x,x,x,125,21.8,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classB,uniqueclassindicator2,x,x,4,x,x,x,x,125,21.8,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classB,uniqueclassindicator2,x,x,4,x,x,x,x,125,21.8,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator3,x,x,4,x,x,x,x,125,21.8,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator3,x,x,4,x,x,x,x,125,21.8,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator3,x,x,4,x,x,x,x,125,21.8,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator3,x,x,4,x,x,x,x,125,21.8,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classC,uniqueclassindicator4,x,x,6,x,x,x,x,125,21.8,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classC,uniqueclassindicator4,x,x,6,x,x,x,x,125,21.8,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classC,uniqueclassindicator4,x,x,6,x,x,x,x,125,21.8,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classC,uniqueclassindicator4,x,x,6,x,x,x,x,125,21.8,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classC,uniqueclassindicator4,x,x,6,x,x,x,x,125,21.8,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classC,uniqueclassindicator4,x,x,6,x,x,x,x,125,21.8,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator5,x,x,6,x,x,x,x,125,21.8,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator5,x,x,6,x,x,x,x,125,21.8,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator5,x,x,6,x,x,x,x,125,21.8,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator5,x,x,6,x,x,x,x,125,21.8,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator5,x,x,6,x,x,x,x,125,21.8,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator5,x,x,6,x,x,x,x,125,21.8,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x

我想要做的是:如果主数据集的第2列在csv列表1中,则将第6列乘以第11列并替换第12列中的值。但是,如果主数据集主要的第2列中的文本在csv列表2中,然后将列6除以第11列并替换第12列中的值。我必须对大约700k行的数据执行此操作(因此效率非常重要),显然列表1& 2比仅仅1/2的数据大得多。如果我能得到一个可以执行此功能的片段代码,那么我将使用该方法而不是很多。

所以我需要返回的代码如下:

x,classA,uniqueclassindicator1,x,x,3,x,x,x,x,125,375,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
x,classA,uniqueclassindicator1,x,x,3,x,x,x,x,125,375,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
x,classA,uniqueclassindicator1,x,x,3,x,x,x,x,125,375,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
x,classB,uniqueclassindicator2,x,x,4,x,x,x,x,125,0.032,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
x,classB,uniqueclassindicator2,x,x,4,x,x,x,x,125,0.032,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
x,classB,uniqueclassindicator2,x,x,4,x,x,x,x,125,0.032,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
x,classB,uniqueclassindicator2,x,x,4,x,x,x,x,125,0.032,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
x,classA,uniqueclassindicator3,x,x,4,x,x,x,x,125,500,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
x,classA,uniqueclassindicator3,x,x,4,x,x,x,x,125,500,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
x,classA,uniqueclassindicator3,x,x,4,x,x,x,x,125,500,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
x,classA,uniqueclassindicator3,x,x,4,x,x,x,x,125,500,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
x,classC,uniqueclassindicator4,x,x,6,x,x,x,x,125,0.048,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
x,classC,uniqueclassindicator4,x,x,6,x,x,x,x,125,0.048,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
x,classC,uniqueclassindicator4,x,x,6,x,x,x,x,125,0.048,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
x,classC,uniqueclassindicator4,x,x,6,x,x,x,x,125,0.048,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
x,classC,uniqueclassindicator4,x,x,6,x,x,x,x,125,0.048,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
x,classC,uniqueclassindicator4,x,x,6,x,x,x,x,125,0.048,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
x,classA,uniqueclassindicator5,x,x,6,x,x,x,x,125,750,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
x,classA,uniqueclassindicator5,x,x,6,x,x,x,x,125,750,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
x,classA,uniqueclassindicator5,x,x,6,x,x,x,x,125,750,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
x,classA,uniqueclassindicator5,x,x,6,x,x,x,x,125,750,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
x,classA,uniqueclassindicator5,x,x,6,x,x,x,x,125,750,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
x,classA,uniqueclassindicator5,x,x,6,x,x,x,x,125,750,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x

非常感谢SMNALLY

5 个答案:

答案 0 :(得分:3)

这是一个简短的脚本,它将一次遍历主文件一行,执行您要查找的操作,然后将该行输出到名为'updated-main.csv'的新文件中:

#!/usr/bin/python

# Load the first two CSV class files (assuming only one column)
L1 = set([l.rstrip() for l in open('1.csv') ])
L2 = set([l.rstrip() for l in open('2.csv') ])

with open("main.csv") as IN, open("updated-main.csv", "w") as OUT:
    for l in IN:
        arr = l.rstrip().split(",")
        # "If column 2 of main dataset is in csv list 1"
        if arr[1] in L1:
            # multiply column 6 by column 11 and replace the value in column 12
            arr[11] = str( float(arr[5]) * float(arr[10]) )
        # "If column 2 of main dataset is in csv list 2"
        elif arr[1] in L2:
            # divide column 6 by column 11 and replace the value in column 12
            arr[11] = str( float(arr[5]) / float(arr[10]) )

        OUT.write( ",".join(arr) + "\n" )

因为它遍历(可能是大的)'main.csv'文件中的行,所以它将具有内存效率。使用此脚本和您给出的示例输入,我得到您想要的输出:

X,classA,uniqueclassindicator1,x,x,3,x,x,x,x,125,375.0,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator1,x,x,3,x,x,x,x,125,375.0,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator1,x,x,3,x,x,x,x,125,375.0,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classB,uniqueclassindicator2,x,x,4,x,x,x,x,125,0.032,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classB,uniqueclassindicator2,x,x,4,x,x,x,x,125,0.032,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classB,uniqueclassindicator2,x,x,4,x,x,x,x,125,0.032,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classB,uniqueclassindicator2,x,x,4,x,x,x,x,125,0.032,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator3,x,x,4,x,x,x,x,125,500.0,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator3,x,x,4,x,x,x,x,125,500.0,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator3,x,x,4,x,x,x,x,125,500.0,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator3,x,x,4,x,x,x,x,125,500.0,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classC,uniqueclassindicator4,x,x,6,x,x,x,x,125,0.048,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classC,uniqueclassindicator4,x,x,6,x,x,x,x,125,0.048,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classC,uniqueclassindicator4,x,x,6,x,x,x,x,125,0.048,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classC,uniqueclassindicator4,x,x,6,x,x,x,x,125,0.048,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classC,uniqueclassindicator4,x,x,6,x,x,x,x,125,0.048,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classC,uniqueclassindicator4,x,x,6,x,x,x,x,125,0.048,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator5,x,x,6,x,x,x,x,125,750.0,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator5,x,x,6,x,x,x,x,125,750.0,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator5,x,x,6,x,x,x,x,125,750.0,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator5,x,x,6,x,x,x,x,125,750.0,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator5,x,x,6,x,x,x,x,125,750.0,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator5,x,x,6,x,x,x,x,125,750.0,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x

答案 1 :(得分:3)

这是一个使用字典进行类查找而不是列表的解决方案。当然,测试它总是一个好主意,但我的猜测是整个操作很可能在很大程度上受I / O限制,所以实际实现可能不是很重要。

import csv 
from operator import mul, div 

# [1.]  This function reads each ancillary csv file, and adds the passed in operator
#       to the converter_dictionary 
def converter_dict_mutator(converter_dict, csv_file, operator):
    with open(csv_file, 'rb') as csv:
        for line in csv:
            converter_dict[line.strip()] = operator 

def write_new_rows(main_csv, csv_writer, converter_dict):
    # [3.]  Open up the main csv file with a csv reader
    with open(main_csv, 'rb') as main_csv_fp:
        main_reader = csv.reader(main_csv_fp)

    # [3.]  Loop through each line in the main csv file.  Each row
    #       in the main csv file has been converted to a python list by 
    #       the csv reader
        for row in main_reader:
            # [4.]  Convert the data in the main csv file to the new format
            row[11] = converter_dict[row[1]](float(row[5]), float(row[10]))
            # [5.]  Use the csv writer to write the modified row to the new
            #       csv file
            csv_writer.writerow(row)

def create_new_main_csv(main_csv, new_main_csv, converter_dict):
    # [2.]  Create a csv writer object that will be used to write the new csv file 
    with open(new_main_csv, 'wb') as new_main_csv_fp:
        csv_writer = csv.writer(new_main_csv_fp)

        write_new_rows(main_csv, csv_writer, converter_dict)

def main():
    # [1.]  Create a dictionary of conversion operations by reading 
    #       the two ancillary csv files
    converter_dictionary = {}
    converter_dict_mutator(converter_dictionary, 'csv1.csv', mul)
    converter_dict_mutator(converter_dictionary, 'csv2.csv', div)

    create_new_main_csv('main_dataset.csv', 
                        'new_main_dataset.csv', 
                         converter_dictionary)

if __name__ == '__main__':
    main()

计划细分:
1.程序的第一部分包括构建“converter_dictionary”。此字典的键是辅助csv文件中的“类”,值是要应用于主数据集的函数或操作。在这种情况下,csv1对应于乘法运算,而csv2对应于除法运算。应用于上面给出的示例文件,最终会得到与此相当的字典:

converter_dictionary = {'classA': mul,
                        'classB': div,
                        'classC': div}

分割/乘法操作是从操作员模块导入的,但程序是可扩展的,因为没有什么能阻止您使用来自不同模块的其他操作,甚至编写您自己的函数以应用于主数据集!例如,你可以像这样定义你自己的乘法函数,并替换所有对'mul'函数的引用,在程序中没有任何不良影响:

def my_multiply(x, y):
    return x * y


2。第二步是创建一个新的csv编写器对象。 writer对象可以采用python列表,将该列表转换为csv格式,并将输出写入文件。文档here中有一个很好的描述。

3。创建writer对象后,使用csv reader打开主csv。读者有点像csv编写器对象的反转。给定一个csv文件,阅读器会自动将csv文件的行拆分为python列表(文档here)。

4。接下来,来自主csv的数据被转换为新格式。在我看来,这是该计划中最令人困惑的部分。繁重的工作在这一行完成:

row[11] = converter_dict[row[1]](float(row[5]), float(row[10]))

row [11]当然是指主csv文件中的第12列,这意味着第12列将被更改为某个新值。在此过程中,第一步是使用converter_dict来查看应该使用的操作。通过在converter_dict中使用在主csv文件的第2列(第[1]行)中找到的值进行查找来确定操作。

因此,例如,如果主csv文件的第2列是'classA',则converter_dict将返回函数'mul',如步骤#1中的converter_dictionary所示。逐步地,这个过程看起来像这样:

row[11] = converter_dict["classA"](float(row[5]), float(row[10]))
===============================>
row[11] = mul(float(row[5]), float(row[10]))
=== which is equivalent to ====>
row[11] = float(row[5]) * float(row[10])

此过程假定主csv文件中的每个类也将在其中一个辅助csv文件中找到。如果在其中一个辅助csv文件中找不到该类,python将抛出一个KeyError。如果您希望主csv文件具有辅助csv文件中找不到的类,则可以将此行包装在try / catch块中。


5。最后,csv writer用于将修改后的行写入输出文件。

<强>输出
输出如下所示。具有乘法转换的行具有尾随零,这与上面的不同。如果它困扰你,你可以稍微修改一下脚本来纠正这个问题。

X,classA,uniqueclassindicator1,x,x,3,x,x,x,x,125,375.0,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator1,x,x,3,x,x,x,x,125,375.0,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator1,x,x,3,x,x,x,x,125,375.0,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classB,uniqueclassindicator2,x,x,4,x,x,x,x,125,0.032,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classB,uniqueclassindicator2,x,x,4,x,x,x,x,125,0.032,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classB,uniqueclassindicator2,x,x,4,x,x,x,x,125,0.032,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classB,uniqueclassindicator2,x,x,4,x,x,x,x,125,0.032,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator3,x,x,4,x,x,x,x,125,500.0,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator3,x,x,4,x,x,x,x,125,500.0,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator3,x,x,4,x,x,x,x,125,500.0,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator3,x,x,4,x,x,x,x,125,500.0,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classC,uniqueclassindicator4,x,x,6,x,x,x,x,125,0.048,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classC,uniqueclassindicator4,x,x,6,x,x,x,x,125,0.048,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classC,uniqueclassindicator4,x,x,6,x,x,x,x,125,0.048,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classC,uniqueclassindicator4,x,x,6,x,x,x,x,125,0.048,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classC,uniqueclassindicator4,x,x,6,x,x,x,x,125,0.048,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classC,uniqueclassindicator4,x,x,6,x,x,x,x,125,0.048,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator5,x,x,6,x,x,x,x,125,750.0,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator5,x,x,6,x,x,x,x,125,750.0,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator5,x,x,6,x,x,x,x,125,750.0,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator5,x,x,6,x,x,x,x,125,750.0,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator5,x,x,6,x,x,x,x,125,750.0,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
X,classA,uniqueclassindicator5,x,x,6,x,x,x,x,125,750.0,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x

答案 2 :(得分:2)

我不确定我是否正确理解赏金条件,但这是对Kurtis答案的(希望详细的)解释。我选择他的答案主要是因为要执行的操作的字典查找。

OP想要对csv数据文件的三列(6,11,2)执行操作 要执行的操作取决于第2列的内容是在list1(csv1)还是list2(csv2)......

  • row [11] = row [5] * row [10]如果row [1]在list1中
  • row [11] = row [5] / row [10]如果row [1]在list2中

选择要执行的操作将需要搜索数据文件的每一行的list1和list2。通过操作员查找表(创建一次)来缓解该O(n)搜索。

converter_dict_mutator()构造一个查找表,该表应该使操作员选择一个恒定的时间操作。字典键是list1和list2中的项目。字典值可以是operator.mul()或operator.div()

converter_dictionary =>
{list1_item : mul, list1_item : mul, ... list2_item : div, list2_item : div}

div和mul有两个参数 - 要执行的操作可以写成:

  • row [11] = mul(row [5],row [10])如果row [1]在list1中
  • row [11] = div(row [5],row [10])如果row [1]在list2中

使用converter_dictionary [row [1]]从converter_dictionary检索要在任何给定行上执行的操作 - 所以:

  • row [11] = converter_dictionary [row [1]](row [5],row [10])

write_new_row()通过

完成OP的任务
  • 使用csv_reader
  • 迭代数据文件
  • 使用字典查找执行操作
  • 使用csv_writer
  • 将结果写入新文件

create_new_main_csv()只是创建一个csv_writer,然后用这个csv_writer调用write_new_row()。

function main()创建查找字典并调用create_new_main_csv()

原始代码中添加了一些注释和文档字符串。

import csv 
from operator import mul, div 

def converter_dict_mutator(converter_dict, csv_file, operator):
    """Create an operator lookup table.

    Adds items to converter_dictionary - {csv_file item : operator}
    Assumes csv_file has a single column -> one item per row/line

    converter_dictionary -> dict
    csv_file -> str, filepath
    return dict
    """
    with open(csv_file, 'rb') as csv:
        for line in csv:
            converter_dict[line.strip()] = operator
            # if there are more than items per row/line ...
            # converter_dict[line.strip().split(',')] = operator


def write_new_row(main_csv, csv_writer, converter_dict):
    """Modify column 12 based on columns 2, 6, 10 and write a new file.

    Uses an operator lookup table/dictionary to determine the operation performed.

    main_csv -> str, filepath
    csv_writer -> csv.csv_writer for the new, modified file
    converter_dict -> dict, operator lookup table
    return None
    """
    with open(main_csv, 'rb') as main_csv_fp:
        main_reader = csv.reader(main_csv_fp)
        for row in main_reader:
            # column 1 == row[0]
            # column 12 = operator(column 6, column 11)
            row[11] = converter_dict[row[1]](float(row[5]), float(row[10]))
            csv_writer.writerow(row)

def create_new_main_csv(main_csv, new_main_csv, converter_dict):
    """Create a new, modified data file.

    main_csv -> str, filepath
    newmain_csv -> str, filepath
    coverter_dict -> dict, operator lookup table
    return None
    """
    with open(new_main_csv, 'wb') as new_main_csv_fp:
        csv_writer = csv.writer(new_main_csv_fp)
        write_new_row(main_csv, csv_writer, converter_dict)

def main():
    # creator operator lookup table
    converter_dictionary = {}
    converter_dict_mutator(converter_dictionary, 'csv1.csv', mul)
    converter_dict_mutator(converter_dictionary, 'csv2.csv', div)
    # make the new file
    create_new_main_csv('main_dataset.csv', 'new_main_dataset.csv', converter_dictionary)

if __name__ == '__main__':
    main()

似乎可以合并(不测试)write_new_row()和create_new_main_csv():

def create_new_main_csv(main_csv, new_main_csv, converter_dict):
    """Create a new, modified data file.

    Modify column 12 based on columns 2, 6, 10 and write a new file.
    Uses an operator lookup table/dictionary to determine the operation performed.

    main_csv -> str, filepath
    newmain_csv -> str, filepath
    coverter_dict -> dict, operator lookup table
    return None
    """
    with open(main_csv, 'rb') as main, open(new_main_csv, 'wb') as new:
        main_reader = csv.reader(main)
        new_writer = csv.writer(new)
        for row in main_reader:
            # column 1 == row[0]
            # column 12 = operator(column 6, column 11)
            row[11] = converter_dict[row[1]](float(row[5]), float(row[10]))
            new_writer.writerow(row)

答案 3 :(得分:1)

我最近发现了pandas库,这将使这很容易。 http://pandas.pydata.org/

基本上,您将使用read_csv加载三个数据集中的每一个:

csv1 = pandas.read_csv(...)
csv2 = pandas.read_csv(...)
data = pandas.read_csv(...)

然后,您预先形成“外部”合并。这只会显示两者之间常见的列。

merged_data = pandas.merge(data, csv1, on=[2], how="outer")   # You might have to use left_on and right_on if your column names don't match (or you are using column numbers)
csv1_only = merged_data[pandas.notnull(merged_data[ASDF])]    # ASDF is a column that is only in csv1
# Work with your data like you need
merged_data = pandas.merge(merged_data, csv2, ...)
# edit merged_data as needed

最后,您应该能够将merged_data的前N列写入file或stdout或其他任何内容。

答案 4 :(得分:0)

试试这个,它可以帮助你让它运作:)

示例代码

# import library
import csv

# a list of items for later checking
alist = ["item", "item"]

# open the document in question
with open('main.csv', 'rb') as old_csv:
    # open the main csv in csv.reader
    csv_reader = csv.reader(old_csv)
    # now open the file we are going to write data to
    with open('main_mod.csv', 'wb') as new_csv:
        # open the new csv in csv.writer
        csv_writer = csv.writer(new_csv)
        # for each row, enumerate through contents of csv reader
        for i, row in enumerate(csv_reader):
            # if "line" != 0 then 
            if i != 0:
                # if row[1] (column 2) is in "alist" which is defined at the top then...
                if row[1] in alist:
                    print "in a list"
                    row.append(float(row[10]) / float(row[47])) # your calculation here
                # if row[1] not in "alist" then...
                else:
                    print "not in a list"
                    row.append(float(row[10]) / float(row[47])) ## your calculation here
                #obviously you can use multiple lists and use elif row[1] in alist2:
                #write row to csv_writer
                csv_writer.writerow(row)

如果您需要任何帮助,请回复,我会尽力帮助:)