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