我有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
答案 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)......
选择要执行的操作将需要搜索数据文件的每一行的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有两个参数 - 要执行的操作可以写成:
使用converter_dictionary [row [1]]从converter_dictionary检索要在任何给定行上执行的操作 - 所以:
write_new_row()通过
完成OP的任务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)
如果您需要任何帮助,请回复,我会尽力帮助:)