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

多DataFrame应用自定义赋值函数未生效,寻求排查解决方案

问题分析与修正方案

原代码的核心问题

  • 函数定义在循环内部,且逻辑错误:使用==(比较运算符)而非=(赋值运算符),除else分支外无有效返回值,导致apply无法生成预期结果。
  • 循环结构错误:file.apply(...)代码写在循环外部,仅会处理列表中最后一个DataFrame,前面的DataFrame完全没被处理。
  • 逻辑运算符误用:逐行判断时用了位运算符&,应替换为逻辑运算符and;若用矢量化操作则需用&并给每个条件单独加括号。
  • 列赋值逻辑错误:三个目标列都调用同一个func,但函数逻辑是针对不同列的,这种方式无法实现分栏赋值的需求。

修正方案1:修复apply方式的代码

将函数移到循环外,调整逻辑为根据ranking值返回对应列的内容,一次性生成三个目标列:

import pandas as pd

def process_ranking(row):
    # 初始化三个列为空字符串
    high = ''
    avg = ''
    low = ''
    rank = row['ranking']
    if rank < 100:
        high = rank
    elif 100 <= rank < 200:
        avg = rank
    elif 200 <= rank < 300:
        low = rank
    # 返回对应列的取值,匹配目标列顺序
    return pd.Series([high, avg, low], index=['High Performance', 'Average', 'Low Performance'])

# 遍历所有DataFrame执行处理
for df in tests:
    df[['High Performance', 'Average', 'Low Performance']] = df.apply(process_ranking, axis=1)

修正方案2:更高效的矢量化操作(推荐)

pandas的矢量化操作比apply性能高得多,适合处理大数据量:

for df in tests:
    # 先初始化所有目标列为空字符串
    df['High Performance'] = ''
    df['Average'] = ''
    df['Low Performance'] = ''
    
    # 通过布尔索引精准赋值
    df.loc[df['ranking'] < 100, 'High Performance'] = df['ranking']
    df.loc[(df['ranking'] >= 100) & (df['ranking'] < 200), 'Average'] = df['ranking']
    df.loc[(df['ranking'] >= 200) & (df['ranking'] < 300), 'Low Performance'] = df['ranking']

额外注意事项

  • 确保每个DataFrame都存在ranking列,若列名不一致需同步修改代码。
  • 若ranking是字符串类型,需先转换为数值类型:df['ranking'] = pd.to_numeric(df['ranking'], errors='coerce')

内容的提问来源于stack exchange,提问作者user18708380

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:42:07