如何优化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
相关产品推荐
相关产品推荐

