将某些列转换为python字典

将某些列转换为python字典,python,python-2.7,csv,dictionary,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

我有一个大致如下的CSV文件:

STUDENT_SUBJECT_AREA_VALUE  | STUDENT_LEVEL | HOST_INSTITUTION

222                           1               UK

58                            1               PT

222                           1               FR

223                           1               UK

222                           1               PT
{UK: 2, PT: 2, FR: 1}
def csv_to_dict(file_name):
   with open(file_name, 'rU') as file:
       reader = csv.DictReader(file, delimiter=',')
       return [line for line in reader]
我需要做的是从“寄宿机构”列中获取值,并计算该值出现的次数。输出应该是如下所示的字典:

STUDENT_SUBJECT_AREA_VALUE  | STUDENT_LEVEL | HOST_INSTITUTION

222                           1               UK

58                            1               PT

222                           1               FR

223                           1               UK

222                           1               PT
{UK: 2, PT: 2, FR: 1}
def csv_to_dict(file_name):
   with open(file_name, 'rU') as file:
       reader = csv.DictReader(file, delimiter=',')
       return [line for line in reader]
我曾尝试将CSV文件转换为字典,但该文件非常大,我只需要该特定列。有没有办法浏览CSV并只阅读我需要的专栏? 我正在将CSV文件转换为dict,如下所示:

STUDENT_SUBJECT_AREA_VALUE  | STUDENT_LEVEL | HOST_INSTITUTION

222                           1               UK

58                            1               PT

222                           1               FR

223                           1               UK

222                           1               PT
{UK: 2, PT: 2, FR: 1}
def csv_to_dict(file_name):
   with open(file_name, 'rU') as file:
       reader = csv.DictReader(file, delimiter=',')
       return [line for line in reader]

但这样我就不必要地浏览了所有的专栏。如果我不太清楚,请随时提问。

除非这真的是性能瓶颈,否则您可能需要逐行将所有列读取到内存中。与您的解决方案不同,这不会将整个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})

为了提高性能,您可能需要尝试pandas。 例如:

import pandas as pd
d = pd.read_csv("bla.txt")
d.groupby("HOST_INSTITUTION").count(["STUDENT_SUBJECT_AREA_VALUE"].to_dict()
将产生所需的结果:)


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

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

如果您不想使用计数器:

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(键,默认值)
,如果键不存在,它将返回默认值

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

使用
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 有了它,您可以使用
operator
模块中的
itemgetter
来获取键名为
HOST\u 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}

不幸的是,我在“key=row[2]”中得到一个列表索引超出范围错误@Stagg抱歉我的错误。您的csv文件由多个空格分隔。它不是完美的csv格式。等等minute@Stagg知道了。只需添加
skipinitialspace
参数。@Stagg在for循环中,您需要添加一个条件来检查行(
如果行:
)是否为空。基本上,OPs输入文件包含空行,这会抛出异常。如果您使用与OP共享的相同输入文件,即使您也会遇到相同的异常。很巧,我在“key=row[2]”@Stagg中得到一个列表索引超出范围错误,您的CSV可能结构不好。你能粘贴它的前10行吗?CSV很长,我没有从这里加载它:。这是“伊拉斯谟学生流动性原始数据(2012-13年的学习交流和工作安排)”之一。你能提供前10行吗?