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