我尝试引用pandas文档,但仍然无法弄清楚如何继续。
我有这个数据
In [6]:
df
Out[6]:
strike putCall
0 50 C
1 55 P
2 60 C
3 65 C
4 70 C
5 75 P
6 80 P
7 85 C
8 90 P
9 95 C
10 100 C
11 105 P
12 110 P
13 115 C
14 120 P
15 125 C
16 130 C
17 135 P
18 140 C
19 145 C
20 150 C
我正在尝试运行此代码:
if df['putCall'] == 'P':
if df['strike']<100:
df['optVol'] = 1
else:
df['optVol'] = -999
else:
if df['strike']>df['avg_syn']:
df['optVol'] = 1
else:
df['optVol']= =-999
我收到错误消息:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
以上代码和数据仅用于说明我遇到的问题
任何帮助都将不胜感激。
约翰
Joris很好地回答了上述问题,但我有一个轻微的附加问题。
我如何调用
等函数def Bool2(df):
df['optVol'] = df['strike']/100
return(df)
而不是将optVol的值直接分配给行中的1:
df.loc[(df['putCall'] == 'P') & (df['strike']>=100), 'optVol'] = 1
我想调用函数Bool2并进行分配。显然,Bool2功能比我描绘的要复杂得多。
我试过这个(在黑暗中拍摄),但它不起作用:
df.loc[(df['putCall'] == 'P') & (df['strike']<100), 'optVol'] =df.apply(Bool2,axis=1)
再次感谢您的帮助
答案 0 :(得分:2)
通常,当您想使用if-else逻辑设置值时,布尔索引是解决方案(请参阅docs):
以下逻辑:
if df['strike']<100:
df['optVol'] = 1
可以用布尔索引表示为:
df.loc[df['strike'] < 100, 'optVol'] = 1
对于您的示例,您有多个嵌套的if-else,然后您可以使用&
组合条件:
df.loc[(df['putCall'] == 'P') & (df['strike']>=100), 'optVol'] = 1
上面代码的完全等价物可能是这样的:
df['optVol'] = -999
df.loc[(df['putCall'] == 'P') & (df['strike']>=100), 'optVol'] = 1
df.loc[(df['putCall'] != 'P') & (df['strike']>df['avg_syn']), 'optVol'] = 1
您收到上述错误消息的原因是,在执行if df['strike']<100
时,此比较在元素方面有效,因此df['strike']<100
会为您提供一系列True和False值,而if
则需要一个真或假值。