Pandas 基于第三列的数据帧列差异条件

Pandas 基于第三列的数据帧列差异条件,pandas,Pandas,在以下熊猫数据框架中,如何获得基于“acqDis_nondrv”的第三列“排列” 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_non

在以下熊猫数据框架中,如何获得基于“acqDis_nondrv”的第三列“排列”

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
”和“Close”之间的差异 基于
acqDis\u nondrv
列的
nondrvPrice

我试过了

df['spread']=df['Close']-df['nondrvPrice']
如何为我的需求添加条件

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

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

使用
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给出的答案),因为它更高效(速度方面)

您可以这样做:

df['spread']=df['Close']-df['nondrvPrice']
df.loc[df['acqDis_nondrv'].eq('D'), 'spread'] = df['nondrvPrice'] - df['Close']
您可以使用,例如:



请注意,此答案假设您的列acqDis\u nondrv只能取值“A”和“D”,如果不是这样,请在您的问题中说明这一点。

您的意思是想要列之间的绝对差吗?什么样的条件?你能举个例子吗?条件是-如果acqDis_nondrv='A'那么df['Close']-df['nondrvPrice'],如果acqDis_nondrv='D'df['nondrvPrice']-df['Close'],我认为最好是更新你的问题,而不是在评论中添加你的条件。不,这不是正确的解决方案-如果acqDis_nondrv='A'那么df['Close'-df,这是我想要的['nondrvPrice'],如果acqDis_nondrv='D'df['nondrvPrice']-df['Close'],您在问题中提到了这种情况?很抱歉发布得太早。更新了我的答案,请看一看:)我仍然很惊讶像
apply
这样的人,这很遗憾……在我看来,这是推荐的解决方案。
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