2012-11-24 43 views
1

我有一個巨大的CSV,其中每行都有一個用戶ID。我想要找到在整個集合中最頻繁出現的用戶ID。從CSV文件中找到列中最常見的記錄

我使用csv模塊中的DictReader來讀取csv,因爲我認爲這對稍後處理單個記錄非常有用。

我無法找到一種方法來搜索我創建的字典中鍵「UserID」的各種值並查找最常用的值。

任何幫助將不勝感激!

這是到目前爲止我的代碼:

import csv 
from time import time 
start = time() 
myData=open("myCSV.csv", "rb") 
csvReader= csv.DictReader(myData) 

# declare counters 
volume = 0 

#sum all data usage 
for data in csvReader: 
    volume += float(data["volume_total"]) 
print "Total : %f" %volume 

#calculate processing time 
elapsed = time() - start 
print "Processing time: %f seconds" %elapsed 
+0

你是如何存儲來自'DictReader'的對象?例如,如果您將它們存儲在列表中,是否嘗試過打印該列表的第一個元素? –

+0

嗨@JonClements。我是Python的新手,所以我不確定你的意思。據我瞭解,來自'DictReader'的對象被存儲爲(鍵,值)對,而不是列表...?我誤解了嗎? – SK10

回答

0

的鑰匙,這將是用戶名和值,這將是遭遇數創建字典「usersOccurences」。 使用DictReader從csv文件中遍歷所有記錄。

對於你發現每個用戶ID - 試圖找到usersOccurences字典相應的出現次數數量,並增加它,如果目前的用戶ID不存在於這個字典 - 與起始號碼1

迭代以後還可以添加它探索usersOccurences字典並找到具有最大數量的UserId。

+0

我會試試這個。我擔心這會很慢,因爲我有一個包含成千上萬個不同UID的龐大數據集,並且每次循環訪問整個用戶發生字典時都會效率低下。感謝您的答覆! – SK10

+0

如果您有一個csv文件並附加了新行,您可能需要一些緩存功能。 –

0

或者您可以使用numpy的loadtxt

from numpy import loadtxt 
    a,b = loadtxt("filename.csv", usecols=(0,1), unpack=True) 

然後你就可以創建一個使用列表中理解的字典(它的速度更快!)

a = [1,1,1,1,2,2,2,2,3,3,4,5,5] 
    d = {x:a.count(x) for x in a} 

參閱本question

要找到最頻繁使用的用戶ID:

user_id_list = d.keys() 
    frequency = d.values() 
    index = frequency.index(max(frequency)) 
    famous_user = user_id_list[index] 
+0

感謝您的回答。我沒有聽說過Numpy包,我正在嘗試。然而,當使用行'a,b = loadtxt(「mycsv.csv」,usecols =(0,2),unpack = True)'我得到一個IndexError:列表索引超出範圍,但我的數據肯定至少有3列,第一列和第三列沒有差距。你知道我爲什麼會得到這個錯誤嗎? – SK10

+0

啊我已經修復它 - 第二列(時間)被格式化爲YYYY-MM-DD HH:MM:SS並且loadtxt將日期和時間之間的空白作爲分隔符處理。用'delimiter =',''固定。謝謝! – SK10