如何根据dff每行的列名组合自动从df批量提取生成子DataFrame
Pandas 批量按列名组合提取子DataFrame实现方法
初始构造代码
以下是测试数据的构造逻辑:
import pandas as pd A = [[1, 4, 15, 12, 42, 56, 71, 94, 50,], [-5, 82, 93, -54, 85, 96, -57, 88, 99], [21, 32, 43, -51, 8, 92, -53, 84, 95], [5, 9, 10, -59, 88, 97, -56, 85, 94], [6, 9, 6, -54, 83, 92, -51, 89, 98], [12, 5, 19, -59, 82, 91, -55, 68, 29]] names = [_ for _ in 'lmnopqrst'] df = pd.DataFrame(A, columns=names) d = ['l', 'm', 'n'] f = ['o', 'p', 'q'] g = ['r', 's', 't'] dff = [] for i in list(d): for j in list(f): for k in list(g): dff.append((i,j,k)) dff = pd.DataFrame(dff)
需求说明:
df是列名从l到t的数值型基础表,dff是三组列名做笛卡尔积生成的列名组合表,共27组三列组合。需要自动遍历每一组列名,从df中提取对应列生成独立子DataFrame,无需手动逐一定义。
实现方案
方案1:字典存储子表(最推荐)
用字典统一存储所有生成的子表,以列名拼接的字符串作为键,后续可以直接按键名调用对应子表,管理和检索都很方便:
sub_dfs = {} for _, col_group in dff.iterrows(): cols = col_group.tolist() # 键名用下划线连接三个列名,比如l_o_r对应第一组三列 sub_dfs["_".join(cols)] = df[cols].copy()
调用示例:需要取l、p、t三列的子表时,直接访问sub_dfs["l_p_t"]即可。
方案2:列表按顺序存储子表
如果不需要按名称检索,只需要按组合生成顺序存储,直接用列表追加即可:
sub_dfs_list = [] for _, col_group in dff.iterrows(): sub_dfs_list.append(df[col_group.tolist()].copy())
调用示例:第一组列组合对应的子表为sub_dfs_list[0],按索引顺序取用即可。
注意事项
- 提取子表时建议追加
.copy(),避免后续修改子表数据时连带改动原始df的内容 - 不建议用动态赋值的方式给每个子表生成独立的全局变量,大量零散变量后续维护、遍历的成本极高,用字典或列表统一存储是更规范的工程化写法。
内容的提问来源于stack exchange,提问作者Tony Quiles
相关产品推荐
相关产品推荐

