如何为 pandas 过滤重构大量嵌套 for 循环

How to refactor a lot of nested for loops for pandas filtering

我刚开始使用 pandas 并且有以下(伪代码)函数作为 python 程序的一部分来创建报告

def loop_over_dataframe(df: DataFrame, report_types: dict)
...
for key, value in report_types:
...
    filtered_df = df.query(value["filter"])
    for date in filtered_df["Date"].unique():
        date_df = filtered_df[fildered_df["Date"] == date]
        ...
        for event in date_df["Events"].unique():
            event_df = date_df[date_df[] == event]
            ...
            for company in event_df["CompanyCode"].unique():
                company_df = event_df[event_df["CompanyCode"] == company]
                    generate_report(company_df, key)

在代码审查中,这被认为是一个函数有很多缩进。但我基本上只是循环遍历应该创建的所有报告的 DataFrame。我看不出将其拆分为多个功能的意义,或者我应该这样做吗?在 pandas 中是否还有更好的方法来执行此操作,而不是在整个地方进行循环?

您可以使用 groupby 而不是多个嵌套循环来使代码更加简洁:

def make_reports(df: DataFrame, report_types: dict):
    cols = ['Date', 'Events', 'CompanyCode']

    for key, val in report_types.items():
        for _, grp in df.query(val['filter']).groupby(cols):
            generate_report(grp, key)