使用Python在CSV文件中用前一个元素替换列中的元素
3rd UPDATE: To describe the problem in precise:-
================================================
My script:
#!/usr/local/bin/python3 <bl
import csv, os, sys, time
inputfile='sample.csv'
with open(inputfile, 'r') as input, open('input.csv', 'w') as output:
reader = csv.reader(input, delimiter = ';')
writer = csv.writer(output, delimiter = ';')
list1 = []
header = next(reader)
header.insert(1,'value')
header.insert(2,'Id')
list1.append(header)
count = 0
for column in reader:
count += 1
list1.append(column)
myvalue = []
myvalue.append(column[4])
if count == 1:
firstmyvalue = myvalue
if count > 2 and myvalue != firstmyvalue:
column.insert(0, myvalue[0])
else:
column.insert(0, 0)
if column[0] != column[8]:
del column[0]
column.insert(0,0)
else:
del column[0]
column.insert(0,myvalue[0])
column.insert(1, count)
column.insert(0, 1)
writer.writerows(list1)
rate;sec;core;Ser;row;AC;PCI;RP;ne;net
244000;262399;7;5;323;29110;163;-90.38;2;244
244001;262527;6;5;323;29110;163;-89.19;2;244
244002;262531;6;5;323;29110;163;-90.69;2;244
244003;262571;6;5;325;29110;163;-88.75;2;244
244004;262665;7;5;320;29110;163;-90.31;2;244
244005;262686;7;5;326;29110;163;-91.69;2;244
244006;262718;7;5;323;29110;163;-89.5;2;244
244007;262753;7;5;324;29110;163;-90.25;2;244
244008;277482;5;5;325;29110;203;-87.13;2;244
My expected output:-
rate;value;Id;sec;core;Ser;row;AC;PCI;RP;ne;net
1;0;1;244000;262399;7;5;323;29110;163;-90.38;2;244
1;0;2;244001;262527;6;5;323;29110;163;-89.19;2;244
1;0;3;244002;262531;6;5;323;29110;163;-90.69;2;244
1;323;4;244003;262571;6;5;325;29110;163;-88.75;2;244
1;325;5;244004;262665;7;5;320;29110;163;-90.31;2;244
1;320;6;244005;262686;7;5;326;29110;163;-91.69;2;244
1;326;7;244006;262718;7;5;323;29110;163;-89.5;2;244
1;323;8;244007;262753;7;5;324;29110;163;-90.25;2;244
1;324;9;244008;277482;5;5;325;29110;203;-87.13;2;244
这是我第一次发帖,所以格式可能不太好。对此我表示抱歉。
我有一个叫做sample.CSV的文件。我需要在这个文件中添加额外的列,我可以用下面的脚本来实现。请问我的脚本缺少了什么呢?
如果名为“row”的列中的当前值和前一个元素不同,那么就用前一行的“value”列的值来更新“value”列。如果相同,就把“value”列更新为零。
希望我的问题表达得清楚。非常感谢你的支持。
3 个回答
0
import csv
with open('test.csv') as f, open('output.csv','w') as o:
out = csv.writer(o, delimiter='\t')
out.writerow(["id", 'value', 'row'])
reader = csv.DictReader(f, delimiter="\t") #Assuming file is tab delimited
prev_row = '100'
for line in reader:
if prev_row != line["row"]:
prev_row = line["row"]
out.writerow([line["id"],prev_row,line["row"]])
else:
out.writerow(line.values())
o.close()
这是一个名为 output.csv
的文件的内容:
id value row
1 0 100
2 0 100
3 110 110
4 140 140
0
当然可以!请看下面的内容:
在编程中,有时候我们需要让程序做一些事情,比如重复执行某个操作。这就像是给程序下达一个命令,让它不停地做同样的事情,直到我们告诉它停止。
想象一下,你在厨房里做饭,你可能会需要把水煮沸。你可以把锅放在火上,然后一直观察着,直到水开了。这个过程就像是程序中的“循环”,它会一直运行,直到满足某个条件,比如水开了。
在代码中,我们通常会用一些特定的语法来实现这个循环。比如说,我们可以用一个“for”循环,告诉程序从1数到10,每次加1。这样,程序就会自动帮我们完成这个任务,而我们不需要手动去数。
总之,循环就是让程序重复做某件事,直到我们说停。这样可以让我们的代码更加简洁和高效。
希望这个解释能帮助你更好地理解循环的概念!
previous = []
for i, entry in enumerate(csv.reader(test.csv)):
if not i: # do this on first entry only
previous = entry # initialize here
print(entry)
else: # other entries
if entry[2] != previous[2]: # check if this entries row is equal to previous entries row
entry[1] = previous[2] # add previous entries row value to this entries var
previous = entry
print(entry)
1
这段话的意思是,这个方法可以满足你提到的需求,但你的输出结果明显比问题中要求的内容多了很多。我加了一个Id
列,主要是为了演示一下你也可以对输出的列进行排序。
df = pd.read_csv('sample.csv', sep=";")
df.loc[:,'value'] = None
df.loc[:, 'Id'] = df.index + 1
prev = None
for i, row in df.iterrows():
if prev is not None:
if row.row == prev.row:
df.value[i] = prev.value
else:
df.value[i] = prev.row
prev = row
df.to_csv('output.csv', index=False, cols=['rate','value','Id','sec','core','Ser','row','AC','PCI','RP','ne','net'], sep=';')