我有input.csv,如下所示
苹果400我想输出像output.csv
apple 400 2
香蕉401 3
芒果430 2
橙色440 3
即我们应该计算该特定类型的项目数,并将计数作为第3列插入
我尝试过以下代码
with open('new.csv','r') as csvinput:
with open('update.csv', 'w') as csvoutput:
writer = csv.writer(csvoutput)
reader = csv.reader(csvinput)
all = []
row = next(reader)
row.append("No.of.Rows")
all.append(row)
cn = Counter(map(itemgetter(0), reader))
for k, v in cn.items():
print("k compared is::",k)
with open('new.csv','r') as csvinput:
reader = csv.reader(csvinput)
for row in reader:
print("Executing inner loop")
print("row value compared is ::",row[0])
if k == row[0] :
print("matched")
row.append(v)
all.append(row)
break
writer.writerows(all)
使用此代码它可以工作,但我担心new.csv文件将打开并读取k次,所以有没有比这更好的解决方案
答案 0 :(得分:1)
如果您愿意使用pandas,则可以将csv
加载到数据框中,并使用三行代码轻松操作,如下所示。
有关详细信息,请参阅pandas文档。
import pandas as pd
df = pd.read_csv('input.csv', sep=' ', header=None)
df.groupby([0,1]).size().to_csv('output.csv')
一旦文件直接加载到数据帧df,它就会列出如下数据
>>> df
0 1
0 apple 400
1 banana 401
2 mango 430
3 orange 440
4 banana 401
5 orange 440
6 mango 430
7 apple 400
8 orange 440
9 banana 401
按列分组后,计数会在一行中进行所需的计算。
>>> df.groupby([0,1]).size()
0 1
apple 400 2
banana 401 3
mango 430 2
orange 440 3
dtype: int64
>>>
答案 1 :(得分:0)
您可以简化您的方法:
from collections import Counter
with open('inputs.csv') as in_file, open('outputs.csv', 'w') as out_file:
counts = Counter(map(str.strip, in_file))
for k, v in sorted(counts.items()):
out_file.write(k + ' ' + str(v) + '\n')
如图所示,您只需在读取文件并写入文件时调用open()
。如果您想要阅读一次文件,请拨打open()
一次。我不确定你为什么要多读一遍。这也适用于写入文件。
然后,如果您想查看outputs.csv
一次的内容,可以在with
声明之外调用:
print(open('outputs.csv').read())
哪个输出:
apple 400 2
banana 401 3
mango 430 2
orange 440 3
注意:问题中的文件不是.csv
个文件,因为它们不是逗号分隔的。将它们作为.txt
文件在这里可以。