如何在Pandas的数据框中替换所选行列的值?

14

我有一个训练数据集,其中有12列。 enter image description here

我想根据 Pclass 列的值为1选择 Cabin 列的行。 然后将所选的Cabin列行的值替换为1。

我尝试了下面的代码,但它将Cabin列的所有值都替换为1,甚至是NaN值也替换为1。我该如何仅替换所选行的值?

train['Cabin'] =train[train['Pclass']==1]['Cabin']=1
2个回答

23
你可以使用loc根据Cabin列的条件选择行,并将其设置为标量值。
train.loc[train['Pclass'] == 1, 'Cabin'] = 1

由于以下代码相同,因此您的代码将所有值替换为1

1 == true


train['Cabin'] = 1

示例:

train = pd.DataFrame({'Pclass':[1,2,3,1,2],
                      'Cabin':[10,20,30,40,50]})
print (train)
   Cabin  Pclass
0     10       1
1     20       2
2     30       3
3     40       1
4     50       2

train.loc[train['Pclass'] == 1, 'Cabin'] = 1
print (train)
   Cabin  Pclass
0      1       1
1     20       2
2     30       3
3      1       1
4     50       2

如果您想要分配的值(在此示例中为1)不是常量,该怎么办?我有一个案例,使用这里的变量,可以转换为类似于“如果Pclass < 3,则Cabin = 2 * Pclass”的内容。我尝试了train.loc[train['Pclass'] < 3, 'Cabin'] = train.loc[train['Pclass'] < 3, 'Pclass']*2,但是我既没有得到结果也没有出现错误... - AstroFloyd
1
@AstroFloyd - 代码看起来没问题,应该能够正常工作。 - jezrael
1
@AstroFloyd - 对我来说测试和工作都很好。 - jezrael
1
也许我在将我的情况翻译成你的示例时犯了错误。我找到了一种使用pandas.DataFrame.where()方法的解决方案。 - AstroFloyd

0

你可以直接筛选要更改的行并将值分配给它,而不是筛选、替换,然后再分配给数据框。

所以

train['Cabin'] =train[train['Pclass']==1]['Cabin']=1

变成

train['Cabin'][train['Pclass']==1] = 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接