我有一个具有以下结构的csv文件。我通常会用熊猫来做这件事,但我认为这是不合适的,因为我试着在一亿条线上运行这个程序。我应该使用什么数据结构?
客户、产品、使用 “约翰”,“可乐”,3 "John","Pepsi",5 “山姆”,“百威”,7 "Sam","Pepsi",6
我想输出一个表,按客户端列出最常用的产品,因此:
客户端,Most_used_product “约翰”,“百事” “山姆”,“百威”
我该怎么做?
发布于 2014-01-06 17:23:15
假设您的客户产品csv没有像这样的重复:
“约翰”,“可乐”,3
"John","Pepsi",5
“约翰”,“可乐”,5
同时也忽略了客户端、产品和使用等标题。以下代码应该有效:
import csv
most_used_products = dict()
with open('your_csv_filename.csv', 'rb') as csvfile:
products_reader = csv.reader(csvfile, delimiter=',')
for client, product, str_usage in products_reader:
usage = int(str_usage)
if client not in most_used_products:
most_used_products[client] = (product, usage)
else:
used_product, product_usage = most_used_products[client]
if usage > product_usage:
most_used_products[client] = (product, usage)
for client, product_info in most_used_products.items():
product_name, _ = product_info
print '"%s","%s"' % (client, product_name)发布于 2014-01-06 17:19:17
保存1亿个条目,然后排序有点棘手,除非您使用像SQLite这样的数据库格式。如果这真的是你想要做的事的话,Python有一个SQLite接口。
也许,您可以逐行遍历文件,而不是将整件事情加载到内存中并对其进行排序,只保存每个人的最大条目。这将减少您的内存需求,并意味着您将不必排序一个非常大的数据结构,这在计算上是昂贵的。
只要使用简单的python,它可能看起来如下所示:
clientDict = {}
def addToDict(client,prod,num,clientDict):
clientDict[client] = {"num":num,"prod":prod}
with open("test.csv","r") as csvFile:
for line in csvFile:
(client,prod,num) = line.split(',')
num = int(num)
if client in clientDict:
if clientDict[client]["num"] <= num:
addToDict(client,prod,num,clientDict)
else:
addToDict(client,prod,num,clientDict)这将返回一个字典,每个客户端作为一个键,那里最喜欢的产品和数量作为一个价值。假设您的表没有太多的唯一客户端,这比将整个文件加载到内存中更有效。
这个解决方案也没有考虑到如果一个人有一个号码相同的条目(如John,可口可乐,4和John,Pepsi,4),也没有考虑到累积条目(即John,可口可乐,4将简单地取代John,可口可乐,2)。该程序很容易修改,以考虑到这些差异。
https://stackoverflow.com/questions/20955136
复制相似问题