pandas 可以在视图或切片上使用替换方法来修改原始数据帧吗?

Pha*_*ser 5 python dataframe pandas

我想替换数据框中的某些单元格值(如果它们在一个组内),但如果它们在其他组内则不替换。

例如,我创建以下数据框:

import pandas as pd
df = pd.DataFrame([['a',2,3],['b',2,3],['a',3,3]], columns = ['1st', '2nd', '3rd'])
df

   1st 2nd 3rd
0   a   2   2
1   b   2   3
2   a   3   3
Run Code Online (Sandbox Code Playgroud)

我想将第一列过滤为“a”,然后仅在第二列中将任何 2 替换为 9,将 3 替换为 7。

df.loc[(df['1st']=='a')].replace({2:9, 3:7}, inplace = True)
df # same as original
Run Code Online (Sandbox Code Playgroud)

这尝试在切片的副本而不是视图上设置值,因此无法更新原始数据帧。也许这里正在进行一些链式索引。我希望数据帧的视图(仍然是数据帧类型)将允许替换方法作用于视图,从而作用于原始视图。

我发现唯一有效的方法是要求我对每个要替换的列值对使用一个命令:

df.loc[(df['1st']=='a') & (df['2nd']==2), '2nd'] = 9
df.loc[(df['1st']=='a') & (df['2nd']==3), '2nd'] = 7
df # It worked

    1st 2nd 3rd
0   a   9   2
1   b   2   3
2   a   7   3
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?

是否可以在数据框的视图上使用替换方法或其他方法来修改原始数据?

我试图了解副本与视图以及通过处理过滤结果来修改原始数据框的最佳方法。

感谢您的帮助!

WeN*_*Ben 3

尝试用update

df.update(df.loc[(df['1st']=='a')].replace({2:9, 3:7}))
df
  1st  2nd  3rd
0   a  9.0  7.0
1   b  2.0  3.0
2   a  7.0  7.0
Run Code Online (Sandbox Code Playgroud)

如果不想改变类型

df.loc[(df['1st']=='a')]=df.loc[(df['1st']=='a')].replace({2:9, 3:7})
df
  1st  2nd  3rd
0   a    9    7
1   b    2    3
2   a    7    7
Run Code Online (Sandbox Code Playgroud)