Pandas基于双条件替换DataFrame指定列值不生效问题咨询
问题原因
两种写法都触发了pandas的*链式索引(chained indexing)*机制:代码里连续两次用方括号做索引取值时,第一次索引返回的是原始DataFrame的临时副本,第二次赋值操作实际是修改这个临时副本,临时副本在代码行执行完就会被内存回收,根本没有写入原始Df对象,所以不会抛出任何报错,但原始数据不会有任何改动。
两种错误写法的具体问题:
Df[(Df['time_idx'] ==82) & (Df['Country'] == "France") ]["Debt"]=7:第一步方括号先筛选出符合条件的行,生成独立的临时DataFrame副本,后续给副本的Debt列赋值完全不影响原始Df。Df.iloc[0]["Debt"]=7:Df.iloc[0]先取出第一行生成独立的Series临时副本,给这个临时Series的Debt字段赋值同样不会回写到原始Df。
正确写法
pandas要求所有赋值操作必须在单次索引中同时定位好行、列目标位置,不要拆分写成连续的方括号索引:
- 多条件筛选后赋值,使用
.loc存取器,行筛选条件和列名放在同一个方括号内,用逗号分隔:
Df.loc[(Df['time_idx'] == 82) & (Df['Country'] == "France"), "Debt"] = 7
- 按位置定位单行赋值,同样在单次索引中写全行、列定位规则:
# 按索引标签+列名赋值,修改索引为0的行的Debt值 Df.loc[0, "Debt"] = 7 # 按整数位置定位,适合行索引不是从0开始的场景 Df.iloc[0, Df.columns.get_loc("Debt")] = 7
快速避坑:只要赋值语句是
XX[...][...] = 值的形式,就属于链式索引,必然会出现赋值不生效的问题,必须把两个方括号里的定位条件合并到同一个方括号中,用逗号分隔行、列两个维度的定位规则。
内容的提问来源于stack exchange,提问作者Ignacio Zamanillo
相关产品推荐
相关产品推荐

