根据数据帧切片上的条件更改值



我有一个这样的数据帧:

df = pd.DataFrame(columns=['Dog', 'Small', 'Adult'])
df.Dog = ['Poodle', 'Shepard', 'Bird dog','St.Bernard']
df.Small = [1,1,0,0]
df.Adult = 0

看起来是这样的:

Dog         Small   Adult
0      Poodle          1   0
1      Shepard         1   0
2      Bird dog        0   0
3      St.Bernard      0   0

然后我想在另一列的基础上更改一列。我可以做到:

df.loc[df.Small == 0, 'Adult'] = 1

然而,我只想为第一排的3行这样做。

我可以选择前三行:

df.iloc[0:2]

但如果我试图更改前三行的值:

df.iloc[0:2, df.Small == 0, 'Adult'] = 1

我犯了一个错误。

如果我将两者合并,我也会遇到一个错误:

df.iloc[0:2].loc[df.Small == 0, 'Adult'] = 1

它告诉我正在尝试为切片的副本设置一个值。

我应该如何正确地执行此操作?

您可以将范围作为另一个条件包含在.loc选择中(对于一般情况,我将明确包含0(:

df.loc[(df.Small == 0) & (0 <= df.index) & (df.index <= 2), 'Adult'] = 1

另一种选择是将索引转换为序列以使用pd.Series.between:

df.loc[(df.Small == 0) & (df.index.to_series().between(0, 2)), 'Adult'] = 1

只有在索引已经排序的情况下,基于索引添加条件才有效。或者,您可以执行以下操作:

ind = df[df.Small == 0].index[:2]
df.loc[ind, 'Adult'] = 1

最新更新