You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化pandas冗余循环,批量按Days区间筛选各df的id生成对应列表

解决方案

直接用字典存储所有结果即可,不需要动态生成变量名,实现逻辑更清晰,也避免污染全局命名空间:

完整实现代码

import pandas as pd

# 你的已有变量
dfs = [df_14, df_15, df_16, df_17]
abbreviations = ['14', '15','16', '17']
# 区间规则配置,后续调整边界、增减分类只需修改这里
interval_conf = {
    '_1': lambda x: 30 <= x <= 60, # 对应30-60区间
    '_2': lambda x: 60 < x <= 100  # 对应60-100区间
}

# 初始化结果字典
res = {}

# 遍历每个df和对应的月份缩写
for abbr, df in zip(abbreviations, dfs):
    # 统一列名,处理id/Id大小写不一致的问题
    df_std = df.rename(columns={'Id': 'id'}, inplace=False)
    # 按区间规则生成对应id列表
    for suffix, filter_func in interval_conf.items():
        target_ids = df_std.loc[df_std['Days'].apply(filter_func), 'id'].tolist()
        res[f"{abbr}{suffix}"] = target_ids

# 按你要求的格式打印输出
for k, v in res.items():
    print(f"{k}:  {v}")

方案说明

  • 所有结果都存在res字典中,需要取用某个列表直接用res['14_1']这种方式调用即可,逻辑清晰易维护
  • 区间规则单独抽离为配置项,后续修改规则不需要改动循环逻辑,扩展性更强
  • 不推荐使用动态生成全局变量的方案,容易引发意料之外的命名冲突,如果一定要实现可以用以下写法(仅作示例不建议使用):
    for abbr, df in zip(abbreviations, dfs):
        df_std = df.rename(columns={'Id': 'id'}, inplace=False)
        globals()[f"{abbr}_1"] = df_std.loc[(df_std['Days']>=30) & (df_std['Days']<=60), 'id'].tolist()
        globals()[f"{abbr}_2"] = df_std.loc[(df_std['Days']>60) & (df_std['Days']<=100), 'id'].tolist()
    

追加行操作优化

你当前逐行追加数据的写法在数据量较大时效率很低,可以替换为批量追加:

rows = [['532', 120],['113', 31], ['065', 58],['025', 2]]
df_14 = pd.concat([df_14, pd.DataFrame(rows, columns=['id', 'Days'])], ignore_index=True)

内容的提问来源于stack exchange,提问作者crazier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 12:27:03