如何按条件将两个pandas DataFrame指定部分的值设为相等
问题根因
你的赋值代码触发了pandas的**链式索引(Chained Indexing)**问题,这是pandas赋值失效的最常见原因:
- 代码里
static_df_2.loc[筛选条件]['sales'] = xxx的执行逻辑是:先通过loc取出满足筛选条件的临时副本DataFrame,再对这个临时副本的sales列赋值。整个赋值操作作用在临时对象上,根本没有修改原static_df_2的数据,临时对象执行完赋值就会被回收,原数据自然不会有变化。 - 额外风险:你当前取
old_sales的写法虽然不会报错,但如果两个DataFrame满足筛选条件的行索引存在顺序偏差、索引值不匹配,哪怕两个表尺寸完全一致,直接按索引对齐赋值也会出现值错位的问题。
修正后的代码
因为你明确说明两个DataFrame尺寸完全相同、筛选逻辑一致,最稳妥的写法是把列选择放到loc参数内部(消除链式索引),同时直接提取值数组跳过索引对齐逻辑,100%保证对应位置赋值:
# 定义筛选条件:25 < i <36 等价于i取26到35的整数,用between写法更简洁 filter_mask = ( (static_df_1['i'].between(26, 35)) & (static_df_1['j'].between(26, 35)) ) # 单次loc定位到目标列,避免链式索引;.to_numpy()直接取底层数组,跳过索引对齐 static_df_2.loc[filter_mask, 'sales'] = static_df_1.loc[filter_mask, 'sales'].to_numpy()
如果你需要分别校验两个表的筛选范围,也可以分开定义掩码,逻辑完全一致:
mask_1 = (static_df_1['i'] > 25) & (static_df_1['i'] < 36) & (static_df_1['j'] > 25) & (static_df_1['j'] < 36) mask_2 = (static_df_2['i'] > 25) & (static_df_2['i'] < 36) & (static_df_2['j'] > 25) & (static_df_2['j'] < 36) static_df_2.loc[mask_2, 'sales'] = static_df_1.loc[mask_1, 'sales'].to_numpy()
注意事项
所有pandas赋值操作都要遵循「单次
loc/iloc直接定位到目标区域再赋值」的原则,不要使用连续方括号的[][ ]链式写法,否则要么触发SettingWithCopyWarning警告,要么直接出现赋值不生效、切片数据和原数据意外联动修改的问题。
内容的提问来源于stack exchange,提问作者bluered_earth
相关产品推荐
相关产品推荐

