首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >过滤二维表,在大型表上按客户端查找最常用的产品。

过滤二维表,在大型表上按客户端查找最常用的产品。
EN

Stack Overflow用户
提问于 2014-01-06 16:59:23
回答 2查看 257关注 0票数 0

我有一个具有以下结构的csv文件。我通常会用熊猫来做这件事,但我认为这是不合适的,因为我试着在一亿条线上运行这个程序。我应该使用什么数据结构?

客户、产品、使用 “约翰”,“可乐”,3 "John","Pepsi",5 “山姆”,“百威”,7 "Sam","Pepsi",6

我想输出一个表,按客户端列出最常用的产品,因此:

客户端,Most_used_product “约翰”,“百事” “山姆”,“百威”

我该怎么做?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-06 17:23:15

假设您的客户产品csv没有像这样的重复:

“约翰”,“可乐”,3

"John","Pepsi",5

“约翰”,“可乐”,5

同时也忽略了客户端、产品和使用等标题。以下代码应该有效:

代码语言:javascript
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2014-01-06 17:19:17

保存1亿个条目,然后排序有点棘手,除非您使用像SQLite这样的数据库格式。如果这真的是你想要做的事的话,Python有一个SQLite接口

也许,您可以逐行遍历文件,而不是将整件事情加载到内存中并对其进行排序,只保存每个人的最大条目。这将减少您的内存需求,并意味着您将不必排序一个非常大的数据结构,这在计算上是昂贵的。

只要使用简单的python,它可能看起来如下所示:

代码语言:javascript
复制
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)。该程序很容易修改,以考虑到这些差异。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20955136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档