基于Pandas Dataframe中另一列的内容在一列上运行操作

时间:2017-03-03 17:16:01

标签: python pandas dataframe

我正在尝试转换列'nominal'中行的负值,其中列'side'中的对应值等于'B'。我不想丢失任何未转换的行。我在下面尝试了这个但是加注KeyError('%s not in index' % objarr[mask])

df[-df['nominal']].where(df['side']=='B')

2 个答案:

答案 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