如何批量处理列表中的18个DataFrame执行指定数据计算?
问题描述
我有一个包含18个不同DataFrame的列表,所有DataFrame都包含以“_spec”结尾的列。需要对每个DataFrame执行以下操作:
- 计算每个DataFrame中数值类型列的数量;
- 筛选出数值列每行的和等于数值列数量的负值的行,然后只保留以“_spec”结尾的列;
- 将所有处理后的结果存入一个新的列表,新列表同样包含18个DataFrame。
我已实现单个DataFrame的处理代码:
lvmo_numlength = -len(df.select_dtypes('number').columns.tolist()) # 计算数值列数量的负值 lvmo_spec = df[df.sum(numeric_only=True,axis=1)==lvmo_numlength].filter(regex='_spec') # 筛选符合条件的行并保留_spec列
但不想重复编写18次,尝试了循环和函数但未成功,以下是我的错误代码:
# DataFrame列表 name_list = [lvmo, trx_nonrx, pd, odose_drg, fx, cpn_use, dem_hcc, dem_ori, drg_man, drg_cou, nlx_gvn, nlx_ob, opd_rsn, opd_od, psy_yn, sti_prep_tkn, tx_why, tx_curtx] # 定义函数生成变量名(思路错误) def numlen(name): return name + "_numlen" def spec(name): return name + "_spec" # 循环处理(语法错误) for name in name_list: numlen(name) = -len(name.select_dtypes('number').columns.tolist()) spec(name) = name[name.sum(numeric_only=True,axis=1)]==numlen(name).filter(regex='spec')
问题分析
你的错误集中在这几点:
- 试图用函数返回的字符串作为变量名直接赋值,这不符合Python语法规则;
- 筛选行的逻辑写法错误,布尔索引的位置和比较逻辑都有问题;
- 没必要给每个DataFrame单独生成变量,直接将处理结果存入新列表即可。
正确实现方案
方案1:for循环遍历处理
# 你的DataFrame列表 name_list = [lvmo, trx_nonrx, pd, odose_drg, fx, cpn_use, dem_hcc, dem_ori, drg_man, drg_cou, nlx_gvn, nlx_ob, opd_rsn, opd_od, psy_yn, sti_prep_tkn, tx_why, tx_curtx] # 初始化空列表存储结果 result_list = [] for df in name_list: # 步骤1:计算数值列数量的负值 num_length = -len(df.select_dtypes('number').columns) # 步骤2:筛选符合条件的行,保留_spec结尾的列 filtered_df = df[df.sum(numeric_only=True, axis=1) == num_length].filter(regex='_spec') # 步骤3:将处理后的DataFrame加入结果列表 result_list.append(filtered_df)
方案2:列表推导式(更简洁)
如果追求代码简洁,用列表推导式可以一行完成:
name_list = [lvmo, trx_nonrx, pd, odose_drg, fx, cpn_use, dem_hcc, dem_ori, drg_man, drg_cou, nlx_gvn, nlx_ob, opd_rsn, opd_od, psy_yn, sti_prep_tkn, tx_why, tx_curtx] result_list = [ df[df.sum(numeric_only=True, axis=1) == -len(df.select_dtypes('number').columns)].filter(regex='_spec') for df in name_list ]
关键说明
- 无需为每个DataFrame单独创建变量,遍历原列表处理每个元素后,直接将结果追加到新列表即可;
df.select_dtypes('number').columns本身是可迭代对象,无需转成列表再取长度,直接使用len()即可;- 筛选行的逻辑:先计算每行数值列的和,与
-数值列数量比较得到布尔索引,用该索引筛选行后,再通过filter(regex='_spec')保留目标列; - 最终
result_list就是包含18个处理后DataFrame的新列表。
内容的提问来源于stack exchange,提问作者zkMO
相关产品推荐
相关产品推荐

