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

如何用NumPy数组更新DataFrame列?循环赋值仅存最后值问题

问题分析与修复方案

原代码存在两个核心问题,导致仅最后一组能生成Rank列:

  1. 循环逻辑错误:内层循环仅更新df3为当前分组,但循环结束后df3只保留最后一个分组,后续计算仅针对最后一组执行,前两组的Rank计算被完全跳过。
  2. 副本修改不生效:df3 = df2.get_group(i[j])得到的是分组副本,直接修改df3["Rank"]不会同步到原DataFrame,必须将结果映射回原df的对应行。

修复后的代码方案(推荐用apply简化逻辑)

import numpy as np
# 假设VIKOR和rank_preferences已正确导入/定义

# 提前初始化Rank列,避免首次插入的判断逻辑
df['Rank'] = np.nan

# 定义分组处理函数
def calculate_rank(group):
    matrix = group[['Aging','DisputePercent','TotalAmount']].to_numpy()
    weights = np.array([0.25, 0.3, 0.45])
    types = np.array([-1, 1, 1])
    vikor = VIKOR()
    pref = vikor(matrix, weights, types)
    rank = rank_preferences(pref, reverse=False)
    
    print(f'Priority {group.name} - Preference values: ', np.round(pref, 4))
    # 为当前分组赋值Rank并排序
    group['Rank'] = rank
    return group.sort_values(by='Rank', ascending=True)

# 应用分组处理并合并回原DataFrame
df = df.groupby('Priority', group_keys=False).apply(calculate_rank)

若坚持用循环实现的修复版本

import numpy as np
# 假设VIKOR和rank_preferences已正确导入/定义

# 初始化Rank列
df['Rank'] = np.nan
priority_list = df['Priority'].unique()
df_groups = df.groupby('Priority')

for priority in priority_list:
    group = df_groups.get_group(priority)
    matrix = group[['Aging','DisputePercent','TotalAmount']].to_numpy()
    weights = np.array([0.25, 0.3, 0.45])
    types = np.array([-1, 1, 1])
    vikor = VIKOR()
    pref = vikor(matrix, weights, types)
    rank = rank_preferences(pref, reverse=False)
    
    print(f'Priority {priority} - Preference values: ', np.round(pref, 4))
    # 将Rank赋值回原DataFrame的对应行
    df.loc[df['Priority'] == priority, 'Rank'] = rank

# 可选:按Priority和Rank排序
df = df.sort_values(by=['Priority', 'Rank'], ascending=[True, True])

关键修复点说明

  • 提前初始化Rank列,省去首次插入的判断逻辑,直接在原df上修改。
  • 使用groupby.apply或df.loc将分组计算的Rank映射回原DataFrame,确保所有分组的结果都被保留。
  • 修正循环逻辑,让每个分组的计算逻辑都在循环内部执行,而非仅处理最后一个分组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:42:41