计算csv中的相同项目并将计数作为列附加

时间:2018-01-18 05:09:48

标签: python python-3.x python-2.7

我有input.csv,如下所示

苹果400
香蕉401
芒果430
橙色440
香蕉401
橙色440
芒果430
apple 400
橙色440
香蕉401

我想输出像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次,所以有没有比这更好的解决方案

2 个答案:

答案 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文件在这里可以。