Pandas中匹配指定列值更新特定列全量行值失败问题求助
解决Pandas DataFrame仅最后一行更新的问题
我太懂这种挫败感了——明明想批量更新匹配条件的所有行,结果只有最后一行乖乖听话,其他行完全没变化!看你贴的代码片段,问题大概率出在Pandas的视图/副本机制上,这可是新手踩坑重灾区。
问题根源
你先写了ndf = df[df['ISBN']==isbn],这种链式索引(df[])很容易触发Pandas返回的是原DataFrame的副本而非视图。这时候你后续的赋值操作可能只是修改了副本,原DataFrame根本没收到变化,最后只有某次赋值碰巧命中了原数据,才导致最后一行被修改。
靠谱的解决方案
直接用Pandas官方推荐的.loc定位赋值,一步到位避开副本坑:
def update_status(self, isbn=0, status='yes'): print("\nUpdating Status\n") df = self.data # 直接通过.loc定位匹配行,赋值STATUS列 df.loc[df['ISBN'] == isbn, 'STATUS'] = status # 打印匹配行确认更新结果 print(df[df['ISBN'] == isbn])
如果非要先筛选子集再操作,记得用.loc来筛选,确保拿到的是原DataFrame的视图:
def update_status(self, isbn=0, status='yes'): print("\nUpdating Status\n") df = self.data # 用.loc筛选,确保ndf是原df的视图 ndf = df.loc[df['ISBN'] == isbn] if len(ndf) > 0: ndf['STATUS'] = status print(df)
额外排查点
如果上面的方法还是不行,检查下你的DataFrame索引是否有重复值!重复索引会让.loc的行为异常,这时候可以先重置索引:
def update_status(self, isbn=0, status='yes'): print("\nUpdating Status\n") # 重置索引为唯一整数索引,避免重复索引干扰 df = self.data.reset_index(drop=True) df.loc[df['ISBN'] == isbn, 'STATUS'] = status print(df)
内容的提问来源于stack exchange,提问作者Al Mashud Shishir
相关产品推荐
相关产品推荐

