Pandas按条件修改DataFrame值不生效但查询打印正常
问题原因
你遇到的是pandas最常见的链式索引赋值失效问题,属于核心基础规则踩坑:
- 你写的
df["Flow"][df["Date"] == "2022-02-23"]是两次拆分的索引操作:第一步df["Flow"]会先返回一个独立的Series临时副本(和原DataFrame没有绑定关联),第二步的赋值操作是在这个临时副本上执行的,修改根本不会同步到原df上,自然看不到效果,多数场景下pandas会抛出SettingWithCopyWarning提示这个问题。 - 直接执行
df["Flow"] = 100是单次直接操作原DataFrame的列属性,没有生成中间副本,所以赋值可以正常生效。
正确写法
所有带行筛选的赋值操作,统一使用.loc索引器完成,把行筛选条件、目标列名放在同一次索引调用里,直接操作原DataFrame,不会生成中间副本:
单条件赋值
# 语法:df.loc[行筛选条件, 目标列名] = 要赋的值 df.loc[df["Date"] == "2022-02-23", "Flow"] = 100
多条件叠加赋值
多个筛选条件需要分别用括号包裹,逻辑与用&连接,逻辑或用|连接即可,比如同时筛选日期为2022-02-23、时间大于12:00的行修改Flow值:
df.loc[ (df["Date"] == "2022-02-23") & (df["Time"] > "12:00"), "Flow" ] = 100
如果需要同时修改多列,把目标列名换成列表即可:
# 同时修改Flow、Pressure两列的匹配行值 df.loc[df["Date"] == "2022-02-23", ["Flow", "Pressure"]] = 100
注意:
.loc的参数顺序固定,第一个位置传行筛选规则,第二个位置传列选择规则,不要写反顺序。
内容的提问来源于stack exchange,提问作者ObeseNeutrino
相关产品推荐
相关产品推荐

