Che*_*nis 5 python loops aggregation
我有一个排序和嵌套的列表。列表中的每个元素有3个子元素;'药物名称',Doctor_id,金额。对于给定的药物名称(重复),医生 ID 不同,数量也不同。请参阅下面的示例列表..
我需要一个输出,其中对于每个药物名称,我需要计算该药物的唯一医生 ID 总数和美元金额总和。例如,对于下面的列表片段..
[
['CIPROFLOXACIN HCL', 1801093968, 61.49],
['CIPROFLOXACIN HCL', 1588763981, 445.23],
['HYDROCODONE-ACETAMINOPHEN', 1801093968, 251.52],
['HYDROCODONE-ACETAMINOPHEN', 1588763981, 263.16],
['HYDROXYZINE HCL', 1952310666, 945.5],
['IBUPROFEN', 1801093968, 67.06],
['INVEGA SUSTENNA', 1952310666, 75345.68]
]
Run Code Online (Sandbox Code Playgroud)
所需的输出如下。
[
['CIPROFLOXACIN HCL', 2, 516.72],
['HYDROCODONE-ACETAMINOPHEN', 2, 514.68]
['HYDROXYZINE HCL', 1, 945.5]
['IBUPROFEN', 1, 67.06]
['INVEGA SUSTENNA', 1, 75345.68]
]
Run Code Online (Sandbox Code Playgroud)
在数据库世界中,这是最简单的事情,只需对药物名称进行简单的 GROUP BY 即可。在Python中,我不允许使用PANDAS、NumPy等。只是Python的基本构建块。我尝试了下面的代码,但无法重置计数变量来计算医生 ID 和金额。这段带注释的代码是多次尝试之一。不确定我是否需要使用嵌套的 for 循环或 for 循环-while 循环组合。
感谢所有帮助!
aggr_list = []
temp_drug_name = ''
doc_count = 0
amount = 0
for list_element in sorted_new_list:
temp_drug_name = list_element[0]
if temp_drug_name == list_element[0]:
amount += float(amount)
doc_count += 1
aggr_list.append([temp_drug_name, doc_count, amount])
print(aggr_list)
Run Code Online (Sandbox Code Playgroud)
由于列表已经排序,您可以简单地迭代列表(l在下面的示例中命名)并跟踪上次迭代的名称,如果当前迭代的名称与上次迭代的名称不同,则插入一个新条目输出。使用一个集合来跟踪当前药物已经看到的医生 ID,如果没有看到医生 ID,则仅将输出的最后一个条目的第二项加 1。并将输出的最后一个条目的第三项增加当前迭代的量:
output = []
last = None
for name, id, amount in l:
if name != last:
output.append([name, 0, 0])
last = name
ids = set()
if id not in ids:
output[-1][1] += 1
ids.add(id)
output[-1][2] += amount
Run Code Online (Sandbox Code Playgroud)
output变成:
[['CIPROFLOXACIN HCL', 2, 506.72],
['HYDROCODONE-ACETAMINOPHEN', 2, 514.6800000000001],
['HYDROXYZINE HCL', 1, 945.5],
['IBUPROFEN', 1, 67.06],
['INVEGA SUSTENNA', 1, 75345.68]]
Run Code Online (Sandbox Code Playgroud)
请注意,十进制浮点数在计算机使用的二进制系统中近似计算(请阅读浮点数学是否损坏?),因此一些小错误是不可避免的,如上面第二个条目的总和所示。
| 归档时间: |
|
| 查看次数: |
7056 次 |
| 最近记录: |