我正在尝试转换列'nominal'
中行的负值,其中列'side'
中的对应值等于'B'。我不想丢失任何未转换的行。我在下面尝试了这个但是加注KeyError('%s not in index' % objarr[mask])
df[-df['nominal']].where(df['side']=='B')
答案 0 :(得分:4)
你应该试试这个:
df.loc[ ( df.side == 'B' ), 'nominal' ] *= -1
答案 1 :(得分:3)
只需在带有&
的布尔索引中使用这两个条件。
df[(df.side == 'B') & (df.nominal < 0)]
或者如果您打算修改,
df.loc[(df.side == 'B') & (df.nominal < 0), 'nominal']
示例强>
>>> df = pd.DataFrame(dict(side=['A']*3+['B']*3, nominal = [1, -2, -2, 2, 6, -5]))
>>> df
nominal side
0 1 A
1 -2 A
2 -2 A
3 2 B
4 6 B
5 -5 B
>>> df.loc[(df.side == 'B') & (df.nominal < 0), 'nominal'] = 1000
>>> df
nominal side
0 1 A
1 -2 A
2 -2 A
3 2 B
4 6 B
5 1000 B
这是一种非常标准的方法,用于过滤Pandas中经常遇到的数据。请参阅Pandas文档中的Boolean Indexing。
<强>更新强>
对于更新后的问题描述,我们可以使用扩充赋值运算符*=
将我们想要的值乘以-1。
df.loc[(df.side == 'B'), 'nominal'] *= -1
示例强>
>>> df = pd.DataFrame(dict(nominal = [1, 2, 5, 3, 5, 3], side=['A']*3 + ['B']*3))
>>> df
nominal side
0 1 A
1 2 A
2 5 A
3 3 B
4 5 B
5 3 B
>>> df.loc[(df.side == 'B'), 'nominal'] *= -1
df
nominal side
0 1 A
1 2 A
2 5 A
3 -3 B
4 -5 B
5 -3 B