2017-09-23 73 views
0

我有这个CSV文件,其中包含大量的信息。我编写了一个程序,能够计算'反馈'栏内的内容及其频率。CSV选择多列

我现在的问题是,在“反馈”列中生成了项目之后,我想专门提出另一个列,它们符合“反馈”列。

CSV文件的一些示例如下:

Feedback  Description Status 
Others  Fire Proct  Complete 
Complaints Grass   Complete 
Compliment Wall   Complete 
...   ...   ... 

随着“反馈”列的频率,我现在想展示,让我们说,如果我选择“投诉”。然后,我希望所有符合“描述”中的“投诉”的内容都能显示出来。

事情是这样的:

Complaints Grass 
Complaints Table 
Complaints Door 
...   ... 

以下是我的代码至今:

import csv, sys, os, shutil 
from collections import Counter 

reader = csv.DictReader(open('data.csv')) 
result = {} 
for row in reader: 
    for column, value in row.iteritems(): 
     result.setdefault(column,[]).append(value) 

list = [] 
for items in result['Feedback']: 
    if items == '': 
     items = items 
    else: 
     newitem = items.upper() 
     list.append(newitem) 

unique = Counter(list) 

for k, v in sorted(unique.items()): 
    print k.ljust(30),' : ', v 

这只是由此算什么是“反馈”栏目内的部分和频率它。

+0

请加你迄今为止编写的代码。 –

+0

@MartinEvans刚刚添加了它。 – Luke

回答

1

你也可以存储defaultdict()拿着条目列表每个类别如下:

import csv 
from collections import Counter, defaultdict 

with open('data.csv', 'rb') as f_csv: 
    csv_reader = csv.DictReader(f_csv) 

    result = {} 
    feedback = defaultdict(list) 

    for row in csv_reader: 
     for column, value in row.iteritems(): 
      result.setdefault(column, []).append(value) 
     feedback[row['Feedback'].upper()].append(row['Description']) 

data = [] 

for items in result['Feedback']: 
    if items == '': 
     items = items 
    else: 
     newitem = items.upper() 
     data.append(newitem) 

unique = Counter(data) 

for k, v in sorted(unique.items()): 
    print "{:20} : {:5} {}".format(k, v, ', '.join(feedback[k])) 

这将显示您的输出:

COMPLAINTS   :  2 Grass, Door 
COMPLIMENT   :  2 Wall, Table 
OTHERS1    :  1 Fire Proct 

还是多行相反,如果你使用:

print "{:20} : {:5}".format(k, v) 
    print ' ' + '\n '.join(feedback[k]) 

当使用csv库,你应该用Python 2.x中的rb打开你的文件。同时避免使用list作为变量名,因为这会覆盖Python list()函数。

注意:打印对齐数据时使用format()更容易。

1

您可以使用此代码片段末尾的代码来完成此操作,该代码片段来自您的问题中的代码。我修改了如何使用with语句读取文件,以确保在不再需要时关闭文件。我还更改了名为list的变量名称。因为它隐藏了内置类型的名称,大多数人认为这是一种糟糕的编程习惯。有关此主题和相关主题的更多信息,请参阅PEP 8 - Style Guide for Python Code

出于测试目的,我还添加了'Complaints'类型的'Feedback'项目的更多行。

import csv 
from collections import Counter 

with open('information.csv') as csvfile: 
    result = {} 
    for row in csv.DictReader(csvfile): 
     for column, value in row.iteritems(): 
      result.setdefault(column, []).append(value) 

items = [item.upper() for item in result['Feedback']] 
unique = Counter(items) 

for k, v in sorted(unique.items()): 
    print k.ljust(30), ' : ', v 

print 
for i, feedback in enumerate(result['Feedback']): 
    if feedback == 'Complaints': 
     print feedback, ' ', result['Description'][i] 

输出:

COMPLAINTS      : 3 
COMPLIMENT      : 1 
OTHERS       : 1 

Complaints Grass 
Complaints Table 
Complaints Door