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

如何批量处理列表中的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 12:05:19