2017-05-16 146 views
0

我有一個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} 

我試圖轉換CSV文件導入字典,但該文件是非常非常大的,我只需要一個特定的列。有沒有辦法通過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] 

可是這樣一來,我經歷的所有列unnecessarilly。如果我不清楚,請隨時提出任何問題。

回答

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}) 
+0

不幸的是,我在得到一個列表索引超出範圍的錯誤「鍵=行[2]」 – Stagg

+0

@Stagg您的CSV可能不是結構良好。你能粘貼它的前10行嗎? – gidim

+0

CSV非常長,我從這裏下載了它:http://data.europa.eu/euodp/data/dataset/erasmus-mobility-statistics-2012-13。這是'伊拉茲馬斯學生流動的原始數據(2012-13學習交流和工作實習)'。 – Stagg

0

爲了增強性能,您可能需要嘗試一下熊貓。 例如:

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} 
1

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

您的CSV文件delimitered多的空間。

如果你不想使用計數器:

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 
+0

不幸的是,我得到一個列表索引超出範圍內的錯誤「key = row [2]」 – Stagg

+0

@Stagg對不起,我的錯誤。您的csv文件由多個空格分隔。這不是完美的csv格式。等一下 – wwulfric

+0

沒問題,謝謝你的幫助:) – Stagg

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 掌握這些信息之後,就可以使用itemgetteroperator模塊把所有的值與鍵名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}