【问题标题】:Optimize for-loop with pandas使用 pandas 优化 for 循环
【发布时间】:2021-06-22 13:51:48
【问题描述】:

我有以下代码:

auftrag = []
for datensatz_nummer, datensatz in daten_e303.iterrows():
    if len(auftrag) != 0:
        found = False
        for x in auftrag:
            if x[0]["Rechnungsnummer"] == datensatz["Rechnungsnummer"]:
                if x[0]["Auftragsart"] == datensatz["Auftragsart"]:
                    if x[0]["Mandant"] == datensatz["Mandant"]:
                        if x[0]["Unterauftrag"] == datensatz["Unterauftrag"]:
                            x.append(dict(datensatz))
                            found = True
                            break
        if not found:
            auftrag.append([dict(datensatz)])
    else:
        auftrag.append([dict(datensatz)])

在 daten_e3030 中有一个大型 pandas-dataframe,大约有 50 万行和 8 列,在 auftrag 中有一个带有子列表的列表,其中包含来自 panda-dataframe 的条目。 对于试用,您可以使用这些示例数据: https://1drv.ms/x/s!AnRIWP-3awPOg9YD2oo_INQjCCq2PA?e=IsRayA

导入使用:

daten_e303 = pandas.read_excel("Demo.xlsx")

您有什么想法,我如何将方法从大约 2 小时缩短到 10 分钟以下?

感谢您的帮助, 拉尔斯

【问题讨论】:

  • 如果您向社区提供更大数据框的示例数据,您将获得更快更好的答案。会有一些人花时间浏览您的代码并尝试了解您要查找的内容。相反,添加一个示例数据框,并发布您的预期输出。
  • @ashkangh 感谢您的提示!
  • @LarsK1 你能解释一下这个函数的作用吗?比较来自 xls 和输出的输入数据,我看不出有什么区别。
  • @Andrej Kesely 它读取 excel 文件,然后从我的发票系统中汇总数据,这些数据属于一项工作。因此,它比较 invoicenumber 和工作类型以及 customer-id 和 sub-job-id 是否与 auftrag-list 中的任何条目相同,如果不是,则创建一个新条目,否则将其附加到与数据对应的列表中之前添加的。并且写入子列表的数据被格式化为dict,以便之后处理......

标签: python arrays pandas loops search


【解决方案1】:

来自不同论坛的人给了我一个完美的解决方案:

auftrag = []
daten_e303.Unterauftrag.replace(numpy.nan, 0, inplace=True)
print("Filtern nach Auftrag und Separieren")
for _, y in daten_e303.groupby(["Rechnungsnummer", "Auftragsart", "Unterauftrag"]):
    auftrag.append(y.to_dict("records"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-01
    • 2011-08-30
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    相关资源
    最近更新 更多