如何在Pandas DataFrame中无警告设置单个单元格新值?
解决Pandas SettingWithCopyWarning的几种方法
你的代码功能正常但触发警告,是因为链式索引(df1['x'][df1['x'] == 10])可能让pandas无法判断你操作的是原DataFrame还是它的副本。下面是两种无警告的正确写法:
方法一:直接定位索引和列(最适合你的场景)
既然你明确要修改**索引0、列'x'**的单元格,直接用.loc精确指定位置即可:
mydata = {'x' : [10, 50, 18, 32, 47, 20], 'y' : ['12', '11', 'N/A', '13', '15', 'N/A']} df1 = pd.DataFrame(mydata) df1.loc[0, 'x'] = 5
方法二:基于条件定位(适合不知道索引只知道值的情况)
如果是通过值(比如所有等于10的'x'列单元格)来修改,用.loc把列和条件放在同一层索引里:
mydata = {'x' : [10, 50, 18, 32, 47, 20], 'y' : ['12', '11', 'N/A', '13', '15', 'N/A']} df1 = pd.DataFrame(mydata) df1.loc[df1['x'] == 10, 'x'] = 5
为什么原来的代码会警告?
链式索引(先取列df1['x'],再对列切片[df1['x'] == 10])会让pandas无法确定返回的是原DataFrame的视图还是副本,这种模糊操作就会触发SettingWithCopyWarning。而.loc是pandas推荐的明确索引方式,能确保你直接操作原DataFrame,不会有歧义。
内容的提问来源于stack exchange,提问作者Platothecynic
相关产品推荐
相关产品推荐

