将某些列转换为字典python

时间:2017-05-16 13:30:23

标签: python python-2.7 csv dictionary

我有一个看起来或多或少的CSV文件:

STUDENT_SUBJECT_AREA_VALUE  | STUDENT_LEVEL | HOST_INSTITUTION

222                           1               UK

58                            1               PT

222                           1               FR

223                           1               UK

222                           1               PT

我需要做的是从' HOST_INSTITUTION'中获取值。列并计算该值出现的次数。输出应该是这样的字典:

{UK: 2, PT: 2, FR: 1}

我尝试将CS​​V文件转换为字典,但文件非常大,我只需要该特定列。有没有办法通过CSV并只读取我需要的列? 我将CSV文件转换为这样的字典:

def csv_to_dict(file_name):
   with open(file_name, 'rU') as file:
       reader = csv.DictReader(file, delimiter=',')
       return [line for line in reader]

但是这样我就不必要地浏览所有列。如果我不是很清楚,请随时提出任何问题。

4 个答案:

答案 0 :(得分:1)

shell方式:awk '{print $3}' csv_file_path | sort | uniq -c

您的csv文件使用多个空格分隔。

如果你不想使用Counter:

def csv_to_dict(file_name):
    result = {}
    with open(file_name, 'r') as file:
        reader = csv.reader(file, delimiter=' ', skipinitialspace=True)
        for row in reader:
            key = row[2]
            value = result.get(key, 0) + 1
            result[key] = value
    return result

dict.get(key, default_value),如果密钥不存在,则返回default_value

In [25]: csv_to_dict(your_file_path)
Out[25]: {'FR': 1, 'PT': 2, 'UK': 2}

我的csv文件内容:

STUDENT_SUBJECT_AREA_VALUE  | STUDENT_LEVEL | HOST_INSTITUTION
222                           1               UK
58                            1               PT
222                           1               FR
223                           1               UK
222                           1               PT

答案 1 :(得分:0)

除非它确实是一个性能瓶颈,否则你可能想要逐行读取所有列到内存。与您的解决方案不同,这并不是将整个CSV保留在内存中,而只是计数。

def csv_to_dict(file_name):
   cnt = Counter()
   with open(file_name, 'rU') as file:
       reader = csv.reader(f, delimiter=',')
       for row in reader:
            host_inst = row[2]
            cnt[host_inst] +=1
    return cnt

>>> csv_to_dict("my_file.txt")
Counter({'UK':2,"PT":2,"FR":1})

答案 2 :(得分:0)

为了提高性能,您可能想尝试一下pandas。 例如:

import pandas as pd
d = pd.read_csv("bla.txt")
d.groupby("HOST_INSTITUTION").count(["STUDENT_SUBJECT_AREA_VALUE"].to_dict()

将产生所需的结果:)

{'UK': 2, 'FR': 1, 'PT': 2}

答案 3 :(得分:0)

data.csv作为输入文件

STUDENT_SUBJECT_AREA_VALUE  | STUDENT_LEVEL | HOST_INSTITUTION

222                           1               UK

58                            1               PT

222                           1               FR

223                           1               UK

222                           1               PT

您可以使用csv.DictReader()来读取您的csv到dict 有了这些,您可以使用itemgetter模块中的operator来获取所有值为HOST_INSTITUTION的值。

import csv
def csv_to_dict(file_name='data.csv'):
    result = {}
    with open(file_name, 'r') as file:
        reader = csv.DictReader(file, delimiter=' ', skipinitialspace=True,fieldnames=('STUDENT_SUBJECT_AREA_VALUE','STUDENT_LEVEL','HOST_INSTITUTION'))
        from operator import itemgetter
        res = map(itemgetter('HOST_INSTITUTION'),reader)[1:] #this will print ['UK', 'PT', 'FR', 'UK', 'PT']
        return {each:res.count(each)for each in set(res)}
print csv_to_dict()

输出

{'FR': 1, 'UK': 2, 'PT': 2}