根据Pandas Dataframe中另一列的内容在一个列上运行操作

oba*_*abs 4 python dataframe pandas

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

df[-df['nominal']].where(df['side']=='B')
Run Code Online (Sandbox Code Playgroud)

mir*_*ulo 5

只需在带有的布尔索引中使用这两个条件&

df[(df.side == 'B') & (df.nominal < 0)]
Run Code Online (Sandbox Code Playgroud)

或者如果您打算进行修改,

df.loc[(df.side == 'B') & (df.nominal < 0), 'nominal']
Run Code Online (Sandbox Code Playgroud)

>>> 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
Run Code Online (Sandbox Code Playgroud)

这是一种很常见的用于过滤熊猫中数据的标准方法。请参阅Pandas文档中的布尔索引


更新资料

对于您更新的问题描述,我们可以仅使用增强的赋值运算符*=将期望值乘以-1。

df.loc[(df.side == 'B'), 'nominal'] *= -1
Run Code Online (Sandbox Code Playgroud)

>>> 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
Run Code Online (Sandbox Code Playgroud)


小智 5

你应该试试这个:

df.loc[ ( df.side == 'B' ), 'nominal' ] *= -1
Run Code Online (Sandbox Code Playgroud)

  • 鉴于它与我在下面提供的答案相同,是什么促使您将其添加为答案? (2认同)