Цикл по каждому уникальному значению - PullRequest
0 голосов
/ 24 марта 2020

Впервые на python, и любая помощь по этому вопросу будет принята с благодарностью.

Хорошо, вот сценарий:

У меня есть набор данных, который включает имя клиента, номер заказа, количество испарителей на этом указанном c номере заказа и количество конденсаторов на этом указанном c номере заказа. Моя цель - рассчитать процент заказов, которые включают испаритель и конденсатор для каждого клиента.

Это код, который я придумал до сих пор. Проблема в том, что таким образом я могу указать только одного клиента за раз. Как сделать этот прогон для каждого уникального имени клиента?

 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

Вот фрагмент набора данных. Он включает столбец со значением, к которому я добавил пустой список.

1 Ответ

0 голосов
/ 24 марта 2020

Таким образом, вы хотите только l oop через уникальных клиентов. Это может быть достигнуто с помощью набора для хранения имен клиентов, с которыми вы уже перешли, и оператора 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:

В своем первоначальном вопросе вы заявили, что хотите найти процент клиентов, которые купили как конденсатор, так и испаритель.

Это было бы на самом деле проще сделать со словарем в моем первом редактировании.

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

Здесь процентBoth - это процент клиентов, которые купили и конденсатор, и испаритель

Чтобы сделать это со словарем в моем втором редактировании, вам потребуется вложенное значение для l oop

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...