-1

我有 3 个 csv,两个包含“类”列表,另一个包含我的主数据集,如果第 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

非常感谢提前

4

5 回答 5

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
于 2013-10-04T20:01:06.453 回答
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}

除法/乘法运算是从 operator 模块导入的,但程序是可扩展的,因为没有什么可以阻止您使用来自不同模块的其他运算,甚至可以编写自己的函数以应用于主数据集!例如,您可以像这样定义自己的乘法函数,并替换对“mul”函数的所有引用,而不会对程序产生不良影响:

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


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

3. writer对象创建后,用csv reader打开主csv。读取器有点像 csv 写入器对象的倒数。给定一个 csv 文件,阅读器会自动将 csv 文件的行拆分为 python 列表(此处的文档)。

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

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

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

例如,如果主 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
于 2013-10-05T05:59:26.783 回答
2

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

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

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

选择要执行的操作需要在 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 检索要在任何给定行上执行的操作 - 所以:

  • 行[11] = 转换器字典[行[1]](行[5],行[10])

write_new_row() 通过完成 OP 的任务

  • 使用 csv_reader 遍历数据文件
  • 使用字典查找执行操作
  • 使用 csv_writer 将结果写入新文件

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

函数 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)
于 2013-10-06T19:04:29.387 回答
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

最后,您应该能够将 merge_data 的前 N ​​列写入文件或标准输出或其他任何内容。

于 2013-10-02T17:14:45.590 回答
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)

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

于 2013-10-08T01:46:37.830 回答