如何用NumPy数组更新DataFrame列?循环赋值仅存最后值问题
问题分析与修复方案
原代码存在两个核心问题,导致仅最后一组能生成Rank列:
- 循环逻辑错误:内层循环仅更新
df3为当前分组,但循环结束后df3只保留最后一个分组,后续计算仅针对最后一组执行,前两组的Rank计算被完全跳过。 - 副本修改不生效:
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
相关产品推荐
相关产品推荐

