#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