如何正确修改Pandas多级索引DataFrame的单个元素值
多级列索引DataFrame单值修改正确方案
之前两种写法触发SettingWithCopyWarning的核心原因是使用了链式索引:连续多次通过[]做切片选择时,pandas无法保证中间返回的对象是原数据的视图还是临时生成的副本,对副本赋值不仅会弹出警告,修改也有可能无法同步到原DataFrame上。
操作多级列索引时,不要分层级多次筛选列,在单次索引操作中用元组传入多级列的完整路径,搭配.loc或.iloc一次性定位到目标单元格赋值,就可以完全规避警告。
示例:修改['A','x']列第0行取值为65.2
写法1:.loc按标签定位(最推荐,语义最明确)
将多级列的层级组合以元组形式作为列参数传入,行参数传入目标行的标签:
# 语法规则:df.loc[行标签, (一级列名, 二级列名, ...)] = 赋值 multi_index.loc[0, ('A', 'x')] = 65.2
写法2:.iloc按整数位置定位
适合需要通过整数位置动态定位单元格的场景,示例中目标列('A','x')是第0列,目标第0行对应行整数位置也是0:
multi_index.iloc[0, 0] = 65.2
写法3:整列批量赋值
如果需要给某一整列填充值,同样用元组指定完整列路径即可:
# 给['A','x']列所有行赋值为100 multi_index[('A', 'x')] = 100
避坑提示:所有连续用
[]分层筛选的写法都属于链式索引,比如multi_index['A']['x'].loc[0] = 65.2、multi_index['A'].iloc[1,0] = 65.2这类操作,无论后面接.loc还是.iloc,都存在触发警告、赋值失效的风险。
内容的提问来源于stack exchange,提问作者LivelyECDSA
相关产品推荐
相关产品推荐

