首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何通过if语句修复使用列的前几行的df.apply?

如何通过if语句修复使用列的前几行的df.apply?
EN

Stack Overflow用户
提问于 2020-10-06 20:01:01
回答 1查看 22关注 0票数 0

我有一个数据帧,看起来像这样:

代码语言:javascript
复制
def data(x):
    df['chg'] = (df['close'] - df['open']) / df['open'] * 100
    df['chg_high'] = (df['high'] - df['open']) / df['open'] * 100
    df['chg_low'] = (df['low'] - df['open']) / df['open'] * 100
return df

    time                    open    high    low     close   chg         chg_high    chg_low
0   2013-04-01T00:00:00Z    95.50   106.50  93.70   104.70  9.633508    11.518325   -1.884817
1   2013-04-02T00:00:00Z    103.73  116.00  100.10  116.00  11.828786   11.828786   -3.499470
2   2013-04-03T00:00:00Z    116.00  158.41  110.00  133.78  15.327586   36.560345   -5.172414
3   2013-04-04T00:00:00Z    133.87  150.00  119.00  135.00  0.844102    12.049003   -11.107791
4   2013-04-05T00:00:00Z    134.67  144.00  127.09  141.80  5.294423    6.928046    -5.628574
5   2013-04-06T00:00:00Z    141.80  150.03  138.50  141.00  -0.564175   5.803949    -2.327221

如果满足'chg_high‘列的x的值,它使用x作为利润,否则我希望它使用'chg’列作为利润

我是这样写的:

代码语言:javascript
复制
def f(row):
    if row['chg_high'] > x:
        val = 1 + (x/100)
    elif row['chg_high'] < x:
        val = 1 + (df['chg']/100)
    return val
df['profit'] = df.apply(f, axis=1)

问题是,当不满足该值时,它使用'chg‘列的前几行,而不是'chg_high’小于x的那一行:

代码语言:javascript
复制
data(1)

    time                    open    high    low     close   chg         chg_high    chg_low     profit
22  2013-04-23T00:00:00Z    123.73  138.87  121.12  137.29  10.959347   12.236321   -2.109432   1.01    
23  2013-04-24T00:00:00Z    137.30  161.00  134.98  149.00  8.521486    17.261471   -1.689731   1.01    
24  2013-04-25T00:00:00Z    150.00  170.28  123.20  141.90  -5.400000   13.520000   -17.866667  1.01
25  2013-04-26T00:00:00Z    141.90  142.53  126.68  137.30  -3.241720   0.443975    -10.725863  [1.0963350785340316, 1.1182878627205244, 1.153...   

有没有办法解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-06 21:15:52

您可以在应用程序中使用lambda来更好地控制列:

代码语言:javascript
复制
df['profit'] = df.apply(lambda row: 1+(x/100) if row.chg_high < x else 1+(row.chg/100), axis=1)

这将使用同一行。请注意,您当前的条件不能处理row.chg_high == x

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

https://stackoverflow.com/questions/64225403

复制
相关文章

相似问题

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