python的新手,在此方面的任何帮助将不胜感激。
好,这是场景:
我有一个数据集,其中包括客户名称,订单号,该特定订单号上的蒸发器数量和该特定订单号上的冷凝器数量。我的目标是为每个客户计算包含蒸发器和冷凝器的订单百分比。
这是我到目前为止提出的代码。问题是我只能一次指定一位客户。如何针对每个唯一的客户名称执行此操作?
DEvap = []
DComp = []
Evap_Comp = []
for row in data[1:]:
Customer_Name = row[0]
Sales_order_number = row[1]
Compressor = int(row[2])
Evaporator = int(row[3])
Value = int(row[4])
if Customer_Name == "AIRCOOLER CORPORATION" and Evaporator > 0:
DEvap.append(Value)
if Customer_Name == "AIRCOOLER CORPORATION" and Evaporator > 0 and Compressor >0:
Evap_Comp.append(Value)
total_evaporators = sum(DEvap)
total_evap_comp = sum(Evap_Comp)
attachment = total_evap_comp/total_evaporators
这是数据集的摘要。它包括一列标记为value的列,我曾在其中附加了空列表。
答案 0 :(得分:0)
因此,您只想遍历唯一客户。这可以通过使用一组存储您已经遍历的客户的名称和一个continue语句跳过重复的客户来实现。
类似这样的东西
customers = set()
for row in data[1:]:
name = row[0]
orderNo = row[1]
compressor = int(row[2])
evaporator = int(row[3])
value = int(row[4])
if name in customers:
continue
customers.add(name)
# Check no of Compressors and Evaporators here
# If customers have placed multiple orders, only their first one will be checked here
编辑:针对您的评论,我想做的唯一不修改原始数据集的方法就是用客户名称和总订单创建一个新数据集。
类似这样的东西
totalOrders= {}
for row in data[1:]:
name = row[0]
compressor = int(row[2])
evaporator = int(row[3])
if name in totalOrders:
totalOrders[name][0] += compressor
totalOrders[name][1] += evaporator
else:
totalOrders[name] = [compressor, evaporator]
此代码创建一个以客户名称为关键字的字典,该字典的值是列表[已订购压缩机,已订购蒸发器]
同一客户的多个订单只会更新其在词典中的现有条目。然后,简单地遍历字典并检查两个列表值是否均大于0即可。
编辑2:
肯定有一种方法可以做到:
totalOrders= {}
for row in data[1:]:
name = row[0]
orderNo = row[1]
compressor = int(row[2])
evaporator = int(row[3])
if name not in totalOrders:
totalOrders[name] = []
totalOrders[name].append([orderNo, compressor, evaporator])
在这里,您有一个用客户名作为关键字的字典,其值是列表列表。 但是,我会谨慎处理多层数据结构。如果它们变得太复杂,则可能会使您的代码几乎不可读,并使对代码的细微更改非常困难。像这样的事情应该不是什么大问题。
编辑3:
在最初的问题中,您说过想查找同时购买冷凝器和蒸发器的客户比例。
实际上,在我的第一个Edit中使用字典会更容易。
totalOrders= {}
for row in data[1:]:
name = row[0]
compressor = int(row[2])
evaporator = int(row[3])
if name in totalOrders:
totalOrders[name][0] += compressor
totalOrders[name][1] += evaporator
else:
totalOrders[name] = [compressor, evaporator]
evapCond = 0
for customer in totalOrders:
if totalOrders[customer][0] > 0 and totalOrdrs[customer][1] > 0:
evapCond += 1
percentBoth = evapCond/len(totalOrders) * 100
这是购买冷凝器和蒸发器的客户所占的百分比
要在我的第二次编辑中使用字典来执行此操作,您将需要嵌套的for循环
totalOrders= {}
for row in data[1:]:
name = row[0]
orderNo = row[1]
compressor = int(row[2])
evaporator = int(row[3])
if name not in totalOrders:
totalOrders[name] = []
totalOrders[name].append([orderNo, compressor, evaporator])
evapCond = 0
for customer in totalOrders:
cond = False
evap = False
for order in totalOrders[customer]:
if totalOrders[customer][order][2] > 0:
cond = True
if totalOrders[customer][order][3] > 0:
evap = True
if cond and evap:
evapCond += 1
percentBoth = evapCond/len(totalOrders) * 100