使用Python在CSV文件中用前一个元素替换列中的元素

0 投票
3 回答
555 浏览
提问于 2025-04-18 13:32
    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=';')

撰写回答