我有这个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 :(得分:1)
您还可以存储- (void)myMethod {}
,其中包含每个类别的条目列表,如下所示:
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])
库时,应在Python 2.x中使用csv
打开文件。还要避免使用rb
作为变量名,因为这会覆盖Python list
函数。
注意:打印对齐数据时使用list()
会更容易。
答案 1 :(得分: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