CSV选择多列

时间:2017-09-23 15:58:13

标签: python python-2.7 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

这只是计算“反馈”列中的内容及其频率的部分。

2 个答案:

答案 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