如何使用Pandas按列名中的'dummy{i}'字符串高效拆分含3000列的大型数据集
批量生成dummy分组子数据集的高效方案
完全懂你的痛点——手动写40行重复代码不仅繁琐,还容易出错。这里有几个高效且兼顾内存的方案,帮你一次性搞定所有分组:
推荐方案:用字典统一管理所有分组
最整洁且易维护的方式是把所有子数据集存入一个字典,避免创建一堆零散的变量。结合循环和f-string就能轻松实现:
# 初始化空字典存储所有分组 dummy_groups = {} # 遍历dummy0到dummy39(共40组) for i in range(40): # 构造当前分组的后缀 target_suffix = f"dummy{i}" # 用向量化方法筛选列(比列表推导式更高效) selected_cols = df.columns[df.columns.str.contains(target_suffix)] # 提取子数据集并存入字典,键名用group_0、group_1...命名 dummy_groups[f"group_{i}"] = df[selected_cols]
为什么这个方案好?
- 代码效率:用
df.columns.str.contains()替代列表推导式,是pandas的向量化操作,处理3000列的速度更快。 - 内存效率:pandas默认会返回原数据的视图(而非立即复制整个子数据集),只有当你修改分组数据时才会触发复制,大大节省内存。
- 易维护:所有分组都存在一个字典里,后续访问只需用
dummy_groups["group_5"]这种方式,不用找一堆零散变量。
可选:生成单独变量(不推荐)
如果你确实需要单独的group_0、group_1等变量,可以用globals()动态创建,但这种方式会让全局变量变得杂乱,不建议大规模使用:
for i in range(40): target_suffix = f"dummy{i}" selected_cols = df.columns[df.columns.str.contains(target_suffix)] # 动态创建全局变量 globals()[f"group_{i}"] = df[selected_cols]
额外优化:提前提取后缀避免重复计算
如果你的列名格式非常固定(都是xxx_dummyn),还可以先提取每个列的后缀,再按后缀分组,效率会更高:
# 提取每个列的dummy后缀(比如'abc_dummy0'→'dummy0') col_suffixes = df.columns.str.split("_").str[-1] # 按后缀分组,直接得到每个dummy对应的子数据集 dummy_groups = {suffix: df[col_suffixes == suffix] for suffix in col_suffixes.unique()}
这种方式直接利用pandas的分组能力,省去了循环里的重复筛选,适合列名格式严格统一的场景。
内容的提问来源于stack exchange,提问作者Steve Bermeo
相关产品推荐
相关产品推荐

