没有 PANDAS 的 Python 聚合

标签 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]
]

所需的输出如下。

[
   ['CIPROFLOXACIN HCL', 2, 516.72],
   ['HYDROCODONE-ACETAMINOPHEN', 2, 514.68]
   ['HYDROXYZINE HCL', 1, 945.5]
   ['IBUPROFEN', 1, 67.06]
   ['INVEGA SUSTENNA', 1, 75345.68]
]

在数据库世界中,通过药物名称上的简单 GROUP BY 是最简单的事情。在Python中,我不允许使用PANDAS、NumPy等。只是Python的基本构建 block 。我尝试了下面的代码,但无法重置计数变量来计算医生 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)

最佳答案

由于列表已经排序,您可以简单地迭代列表(在下面的示例中名为 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

输出变为:

[['CIPROFLOXACIN HCL', 2, 506.72],
 ['HYDROCODONE-ACETAMINOPHEN', 2, 514.6800000000001],
 ['HYDROXYZINE HCL', 1, 945.5],
 ['IBUPROFEN', 1, 67.06],
 ['INVEGA SUSTENNA', 1, 75345.68]]

请注意,十进制 float 近似于计算机使用的二进制系统(请阅读 Is floating point math broken? ),因此一些小错误是不可避免的,如上面第二个条目的总和所示。

关于没有 PANDAS 的 Python 聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55271084/

相关文章:

java - Android 定时器/时钟

vba - 更快相当于 worksheetfunction.Clean

mongodb - 如何在mongo聚合中将数字转换为月份

rest - Yodlee 聚合 REST API register3 userPreferences 选项

python - 同时操作字典中键的两个值

python - 在 Mac OS 10.8.4 上安装 PIL 时出错

python - 使用循环将对象添加到列表(python)

sql - 在 SQL 中通过日期和时间执行聚合

python - 如何在 Python 中从同一个套接字发送和接收?

python - cp_model.CpModel() 中是否有与 pywrapcp.Solver() 中的 IsEqualCstVar 类似的功能?