Python выполняет итерацию по строкам csv с несколькими факторами

#python #csv #iteration

Вопрос:

Я хочу обобщить данные по единицам измерения, периоду и идентификатору поставщика. Для каждой Уникальной единицы измерения и Периода возвращайте идентификатор поставщика с наибольшей суммой. Это суммировало бы суммы для идентификатора поставщика в данной единице/периоде. Поэтому в приведенном ниже случае он должен вернуться:

5400,6 — 7957.33

6300,7 — 9801.10

Я хотел бы добиться этого, повторяя данные БЕЗ использования Numpy или Pandas, поскольку я пытаюсь понять логику. Я застрял на логической части, как повторить это и сохранить данные. Ниже я пробовал словари, но не уверен, что это лучший способ… Вот краткий образец данных:

 cv = "Unit,SupplierID,ReceivedPeriod,Amount/n5400,0213123,6,3450.87/n5400,0521332,6,5902.21/n5400,0213123,6,4506.46/n6300,0293899,7,9801.10/n6300,0381923,7,6203.76"
line = cv.split("/n")
d = {}
for l in line:
    unit,id,period,amount = l.split(",")
    k1 = unit   ","   period
    k2 = id
    if k1 in d:
        if k2 in d[k1]:
        up = d[k1][id]
        nup = float(amount)   float(up)
        d[k1][id] = round(nup, 2)
    else:
        d[k1] = {[id]:amount}

 

То, как я это делаю, кажется сложным, есть ли лучший способ сделать это при повторении строк?

Комментарии:

1. Работает ли опубликованный код, и вы пытаетесь его улучшить? Или он терпит неудачу, и в этом случае, пожалуйста, расскажите нам, как он не делает то, что вы хотите, чтобы он делал?

Ответ №1:

Я изменил вашу строку, чтобы использовать настоящие новые строки вместо вашего поддельного «/n», чтобы код мог легко перейти к чтению файла. Я также добавил код, чтобы пропустить строку заголовка. Это было бы несколько проще с помощью модуля «csv» для анализа строки. Он также был бы немного короче, если бы использовал DefaultDict вместо прямого диктатора.

 cv = "Unit,SupplierID,ReceivedPeriod,Amountn5400,0213123,6,3450.87n5400,0521332,6,5902.21n5400,0213123,6,4506.46n6300,0293899,7,9801.10n6300,0381923,7,6203.76"
d = {}
for l in cv.splitlines():
    unit,id,period,amount = l.split(",")
    if unit == 'Unit':
        continue
    amount = float(amount)
    k1 = unit   ","   period
    if k1 in d:
        if id in d[k1]:
            d[k1][id]  = amount
        else:
            d[k1][id] = amount
    else:
        d[k1] = {id:amount}
print(d)

for k,v in d.items():
    largest = max(v.values())
    print(k,largest)
 

Выход:

 {'5400,6': {'0213123': 7957.33, '0521332': 5902.21}, '6300,7': {'0293899': 9801.1, '0381923': 6203.76}}
5400,6 7957.33
6300,7 9801.1