Pandas DataFrame修改值:.iloc与.loc的区别及循环赋值方法
一、iloc赋值失败的核心原因
你使用df1.iloc[k]["value 2"]赋值属于典型的链式索引操作:第一步df1.iloc[k]会取出对应行的Series对象,这个操作在pandas中绝大多数场景下返回的是原数据的副本,而非指向原DataFrame的视图。后续你对这个临时副本对象执行["value 2"] = xxx赋值,只会修改临时副本,不会作用到原始的df1上,部分运行环境下还会触发SettingWithCopyWarning警告,本质就是pandas在提醒你当前赋值可能不会生效。
二、DataFrame赋值的最优方案
1. 必须用循环的场景
最简单稳定的写法就是你调整后的loc写法,同时指定行索引和列名完成赋值:df.loc[行位置/行筛选条件, 列名] = 赋值内容
这种写法直接操作原始DataFrame对象,不会生成临时副本,赋值100%作用到原数据上。
2. 更推荐的无循环向量化方案
你的匹配更新场景完全不需要写循环,用pandas内置的映射操作一行就能实现,代码更简洁,处理万级以上数据时性能比循环高几十倍:
import pandas as pd d1 = {"KEY": ["KEY1", "KEY2", "KEY3"], "value": ["A", "B", "C"]} df1 = pd.DataFrame(d1) d2 = {"KEY": ["KEY2"], "value_alternative": ["D"]} df2 = pd.DataFrame(d2) # 生成KEY到替代值的映射字典 key_map = df2.set_index("KEY")["value_alternative"].to_dict() # 匹配替换,未匹配到的用原value列填充 df1["value 2"] = df1["KEY"].map(key_map).fillna(df1["value"])
内容的提问来源于stack exchange,提问作者Mr.Hedge
相关产品推荐
相关产品推荐

