我有一个数据帧,看起来像这样:
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’列作为利润
我是这样写的:
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的那一行:
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... 有没有办法解决这个问题?
发布于 2020-10-06 21:15:52
您可以在应用程序中使用lambda来更好地控制列:
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
https://stackoverflow.com/questions/64225403
复制相似问题