pandas 使用loc命令替换值

kkih6yb8  于 2023-05-12  发布在  其他
关注(0)|答案(4)|浏览(215)

有一个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。

mec1mxoz

mec1mxoz1#

删除inplace = True选项。

df.loc[df['Fare']>512]['Fare']=df.loc[df['Fare']>512]['Fare'].astype(int).replace({512:263})

或者干脆不放屁。

df.loc[df['Fare']>512]['Fare'].astype(int).replace({512:263}, 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之前选择该值。
如果您这样做:

df['Fare'].astype(int).replace({512:263}, inplace=True)

你会得到同样的结果。

jyztefdp

jyztefdp2#

当使用.loc时,您希望使用[row, col]而不是[row][col]
尝试:

df.loc[df['Fare']>512, 'Fare']=df.loc[df['Fare']>512, 'Fare'].astype(int).replace({512:263},inplace=True)
egdjgwm8

egdjgwm83#

你有没有什么理由

condition = df['Fare'].astype(int) > 512
df.loc[condition, 'Fare'] = 263

condition是一个布尔序列,.loc只会将该序列中值为True的行赋值给您所需的值。

oyjwcjzk

oyjwcjzk4#

下面的代码片段会更简单

df.loc[df['fare']>512, 'fare'] = 263

该代码仅替换列fare的值。如果要替换多个列值,也可以在方括号内指定。
pandas的实际语法是:

df.loc[row_indexer,col_indexer] = value

相关问题