如何通过存储DataFrame.loc结果的变量修改原DataFrame数据?
问题:如何通过Series变量修改原DataFrame数据?
给定如下DataFrame:
df = pd.DataFrame({'x':[1,2,3], 'y':[4,5,6]})
直接使用df.loc可以一行修改原数据:
df.loc[df['x'] > 1, 'y'] = 7
但如果将loc的查询结果存入变量后,直接对变量赋值只会改变变量本身,无法同步修改原DataFrame的y列:
sel = df.loc[df['x'] > 1, 'y'] sel = 9 # 此操作仅修改sel变量,原df不受影响
可行解决方案
1. 修改Series的.values属性
通过访问Series的.values直接操作底层numpy数组,这种方式会同步修改原DataFrame的数据:
sel = df.loc[df['x'] > 1, 'y'] sel.values = 9
执行后查看原DataFrame:
print(df) # 输出: # x y # 0 1 4 # 1 2 9 # 2 3 9
2. 使用切片赋值操作
通过sel[:]的切片方式赋值,本质是对整个Series视图进行修改,而非重新绑定变量:
sel = df.loc[df['x'] > 1, 'y'] sel[:] = 9
3. 使用update()方法更新
利用pd.Series.update()方法,将新值匹配索引后更新到原Series对应位置,同样会同步修改原DataFrame:
sel = df.loc[df['x'] > 1, 'y'] sel.update(pd.Series([9, 9], index=sel.index))
原理说明
当执行sel = df.loc[df['x'] > 1, 'y']时,sel通常是原DataFrame中y列的视图(而非独立副本),但直接执行sel = 9是给变量sel重新绑定了一个标量值,切断了和原DataFrame的关联。而上述方法都是直接操作视图对应的底层数据或视图本身,因此能同步修改原DataFrame。
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

