Python 如何使用带有if语句的列的第一行修复df.apply?

Python 如何使用带有if语句的列的第一行修复df.apply?,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我有一个如下所示的数据帧: 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

我有一个如下所示的数据帧:

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
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_high'列满足x的值,则使用x作为利润如果不满足,则我希望它使用'chg'列作为利润

我是这样写的:

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
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)

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

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

df['profit'] = df.apply(lambda row: 1+(x/100) if row.chg_high < x else 1+(row.chg/100), axis=1)
df['price']=df.apply(λ行:1+(x/100),如果row.chg\u high
这将使用同一行。 请注意,您当前的条件不能处理row.chg_high==x