基于第三列的差异熊猫数据框列的条件

时间:2021-04-22 12:58:30

标签: pandas

在以下 Pandas 数据框中,如何根据“acqDis_nondrv”获取第三列“spread”,

acqDis_nondrv  Close nondrvPrice
           D      8      32.015
           A      16     5.729
           D      20     20.00
           A      16     5.729
           A      16     5.729

预期结果

    acqDis_nondrv     Close  nondrvPrice  spread
               D      8      32.015.      24.015     
               A      16     5.729        10.271
               D      20     20.00        0
               A      16     5.729        10.271
               A      16     5.729.       10.271

基本上我想要完成的是获取 'Close' 和 ' 之间的差异 nondrvPrice' 基于 acqDis_nondrv 列。

我试过了

df['spread']=df['Close']-df['nondrvPrice']

如何为我的需求添加条件?

  • 如果 acqDis_nondrv == 'A' 那么 df['Close']-df['nondrvPrice'],

  • 如果 acqDis_nondrv == 'D' df['nondrvPrice']-df['Close']

3 个答案:

答案 0 :(得分:1)

您可以使用 np.where,例如:

import numpy as np
df['spread'] = np.where(df['acqDis_nondrv'] == 'A', df['Close'] - df['nondrvPrice'],
                        df['nondrvPrice'] - df['Close'])

df

  acqDis_nondrv  Close  nondrvPrice  spread
0             D      8       32.015  24.015
1             A     16        5.729  10.271
2             D     20       20.000   0.000
3             A     16        5.729  10.271
4             A     16        5.729  10.271

请注意,此答案假定您的列 acqDis_nondrv 只能取值“A”和“D”,如果不是这种情况,请在您的问题中说明。

答案 1 :(得分:0)

使用 apply() 方法:

df['spread']=df.apply(lambda x: x['Close']-x['nondrvPrice'] if x['acqDis_nondrv'] == 'A' else(x['nondrvPrice']-x['Close'] if x['acqDis_nondrv'] == 'D' else x ),axis=1)

现在如果你打印 df 你会得到你想要的输出:

     acqDis_nondrv  Close   nondrvPrice     spread
0           D       8       32.015          24.015
1           A       16      5.729           10.271
2           D       20      20.000          0.000
3           A       16      5.729           10.271
4           A       16      5.729           10.271

注意:如果您熟悉 numpy,请使用 where() 方法(@sophocles 给出的答案),因为它更有效(速度明智)

答案 2 :(得分:0)

你可以这样做:

df['spread']=df['Close']-df['nondrvPrice']
df.loc[df['acqDis_nondrv'].eq('D'), 'spread'] = df['nondrvPrice'] - df['Close']