Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 过滤二维表,在大表上查找客户最常用的产品_Python_Sorting_Filter - Fatal编程技术网

Python 过滤二维表,在大表上查找客户最常用的产品

Python 过滤二维表,在大表上查找客户最常用的产品,python,sorting,filter,Python,Sorting,Filter,我有一个具有以下结构的csv文件。我通常会用熊猫来做这件事,但我不认为这在这里是合适的,因为我正试图在多达1亿条线上运行它。我应该使用什么数据结构 客户、产品、用途 “约翰”,“可口可乐”,3 “约翰”、“百事可乐”,5 “山姆”,“百威”,7 “山姆”,“百事可乐”,6 我想输出一个表,该表提供客户使用最多的产品,因此: 客户,最常用的产品 “约翰”、“百事可乐” “山姆”、“百威” 如何做到这一点?保存1亿个条目,然后进行排序有点棘手,除非您使用类似SQLite的数据库格式。如果这真的是你想

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

客户、产品、用途 “约翰”,“可口可乐”,3 “约翰”、“百事可乐”,5 “山姆”,“百威”,7 “山姆”,“百事可乐”,6

我想输出一个表,该表提供客户使用最多的产品,因此:

客户,最常用的产品 “约翰”、“百事可乐” “山姆”、“百威”


如何做到这一点?

保存1亿个条目,然后进行排序有点棘手,除非您使用类似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)
clientDict={}
def addToDict(客户端、产品、数量、客户端DICT):
clientDict[client]={“num”:num,“prod”:prod}
打开(“test.csv”、“r”)作为csvFile:
对于csvFile中的行:
(客户机,产品,数量)=行分割(','))
num=int(num)
如果客户端在clientDict中:

如果clientDict[client][“num”]假设您的客户端产品csv没有这样的重复:

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)
“约翰”,“可乐”,3

“约翰”,“百事可乐”,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)

在提问之前先尝试一下。你好,亚历克西斯,你已经读过CSV了吗?如果是这样,您使用什么数据结构将其存储在程序中?一旦你有了一个数据结构,就有很多在线排序的资源。也许您可以先尝试一下,然后在有更具体的查询时询问。祝你好运,谢谢。是的,我可以阅读CSV。实际上,使用什么样的数据结构应该是我的问题。我对熊猫很熟悉,但有人告诉我,这对大数据(100万条线)不起作用。我已经开始简单地将此表作为文本处理,但我不知道如何将此特定操作作为文本处理。如果问题是排序和不读取所有1亿行,以及如果两行“John”,“Coke”,3。。“John”、“Coke”,5并不意味着“John”、“Coke”,8(Coke产品加3+5),那么这个解决方案应该适合您。