有一个dataframe,我需要replace
值超过512与263。
所以,我首先使用这行代码来过滤索引:
df.loc[df['Fare']>512]['Fare'].astype(int)
下面是这个的结果:
258 512
679 512
737 512
1234 512
Name: Fare, dtype: int64
这看起来不错!因为它过滤了值大于512的所有4行。现在我需要将这个值替换为263:
df.loc[df['Fare']>512]['Fare']=df.loc[df['Fare']>512]['Fare'].astype(int).replace({512:263},inplace=True)
但它不会改变我的 Dataframe 中的任何内容。例如,当我搜索索引737时,我发现:
df.iloc[737]
结果:
Age 35
Fare 512.329
因此,尽管有上述代码,票价并没有改变为263。
4条答案
按热度按时间mec1mxoz1#
删除
inplace = True
选项。或者干脆不放屁。
关于replace docs:
inplace:bool,default False
如果为True,则在适当位置。注意:这将修改此对象上的任何其他视图(例如DataFrame中的列)。如果为True,则返回调用者。
现在,您正在就地修改dataframe,但是赋值操作符
=
返回调用者,因此您正在使用原始值重写编辑。编辑
实际上,在我的版本(pandas 0.24.0)中,
inplace = True
没有返回任何内容,所以上面的粗体句子可能与版本有关(文档指的是pandas 0.24.2)。顺便说一下,先用
.loc
过滤数据,然后再用replace
是多余的:.replace({512:263})
将仅转换值512,无需在使用.loc
之前选择该值。如果您这样做:
你会得到同样的结果。
jyztefdp2#
当使用
.loc
时,您希望使用[row, col]
而不是[row][col]
。尝试:
egdjgwm83#
你有没有什么理由
condition
是一个布尔序列,.loc
只会将该序列中值为True
的行赋值给您所需的值。oyjwcjzk4#
下面的代码片段会更简单:
该代码仅替换列
fare
的值。如果要替换多个列值,也可以在方括号内指定。pandas的实际语法是: