使用带有pandas的If / Truth语句

时间:2015-08-05 22:24:21

标签: if-statement pandas

我尝试引用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().

以上代码和数据仅用于说明我遇到的问题

任何帮助都将不胜感激。

约翰

OP附加组件

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)

再次感谢您的帮助

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则需要一个真或假值。