首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据Pandas上的列值应用lambda

根据Pandas上的列值应用lambda
EN

Stack Overflow用户
提问于 2017-10-16 23:07:44
回答 2查看 5.6K关注 0票数 2

我有一个数据框架,根据列Order的值,我想取Value列的值并进行一些计算。

DataFrame1

代码语言:javascript
运行
复制
             Order  Shares   Value
2011-01-10   BUY    1300     340.99  
2011-01-10   SELL   1200     340.99
2011-01-11   SELL   1100     330.99   

代码行:

代码语言:javascript
运行
复制
impacts['NewValue']=float(impacts.Order.apply(lambda x: (impacts.Value + (impacts.Value * 0.006)) if x == 'SELL' else (impacts.Value - (impacts.Value * 0.006))))

错误:

TypeError: ufunc 'multiply‘不包含具有签名匹配类型的循环( dtype('S32') dtype('S32') dtype('S32')

我的理解是,错误是由数字的内容引起的,因此我尝试将其转换为浮点数。

预期输出

代码语言:javascript
运行
复制
            Order  Shares   Value   NewValue
2011-01-10   BUY    1300   340.99  338.94
2011-01-10   SELL   1200   340.99  343.03
2011-01-11   SELL   1100   330.99  332.97

任何帮助都是受欢迎的。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-16 23:11:00

希望它有帮助:-)(只修改您自己的代码,您的示例代码将返回错误)

代码语言:javascript
运行
复制
df.apply(lambda x: (x.Value + (x.Value * 0.006)) if x.Order == 'SELL' else (x.Value - (x.Value * 0.006)),axis=1)
Out[790]: 
2011-01-10    338.94406
2011-01-10    343.03594
2011-01-11    332.97594
dtype: float64

获得df

代码语言:javascript
运行
复制
df['NewValue']=df.apply(lambda x: (x.Value + (x.Value * 0.006)) if x.Order == 'SELL' else (x.Value - (x.Value * 0.006)),axis=1)
df
Out[792]: 
           Order  Shares   Value   NewValue
2011-01-10   BUY    1300  340.99  338.94406
2011-01-10  SELL    1200  340.99  343.03594
2011-01-11  SELL    1100  330.99  332.97594

我将使用np.where

代码语言:javascript
运行
复制
import numpy as np
np.where(df.Order=='SELL',(df.Value + (df.Value * 0.006)),(df.Value - (df.Value * 0.006)) )
Out[794]: array([ 338.94406,  343.03594,  332.97594])

在重新分配之后

代码语言:javascript
运行
复制
df['NewValue']=np.where(df.Order=='SELL',(df.Value + (df.Value * 0.006)),(df.Value - (df.Value * 0.006)) )
df
Out[796]: 
           Order  Shares   Value   NewValue
2011-01-10   BUY    1300  340.99  338.94406
2011-01-10  SELL    1200  340.99  343.03594
2011-01-11  SELL    1100  330.99  332.97594
票数 2
EN

Stack Overflow用户

发布于 2017-10-16 23:27:00

(对评论来说太长了)下面是温的np.where的更简洁的版本

代码语言:javascript
运行
复制
i = np.where(df.Order == 'SELL', 1, -1) * 0.006
df.Value = df.Value.mul(i) + df.Value

print(df.Value)
2011-01-10    338.94406
2011-01-10    343.03594
2011-01-11    332.97594
dtype: float64

使用df.Order确定操作前的符号。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46780270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档