使用逻辑表达式和if语句评估pandas系列值

nea*_*lob 13 python if-statement series pandas

我在使用if语句评估字典中的值时遇到了麻烦.

给出以下字典,我从数据框导入(如果它很重要):

>>> pnl[company]
29:   Active Credit       Date   Debit Strike Type
0      1      0 2013-01-08  2.3265  21.15  Put
1      0      0 2012-11-26      40     80  Put
2      0      0 2012-11-26     400     80  Put
Run Code Online (Sandbox Code Playgroud)

我尝试评估以下语句以确定最后一个值的值Active:

if pnl[company].tail(1)['Active']==1:
    print 'yay'
Run Code Online (Sandbox Code Playgroud)

但是,我遇到以下错误消息:

Traceback (most recent call last):
  File "<pyshell#69>", line 1, in <module>
    if pnl[company].tail(1)['Active']==1:
  File "/usr/lib/python2.7/dist-packages/pandas/core/generic.py", line 676, in __nonzero__
    .format(self.__class__.__name__))
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
Run Code Online (Sandbox Code Playgroud)

这让我感到惊讶,因为我可以在没有if语句的情况下使用上面的命令显示我想要的值:

>>> pnl[company].tail(1)['Active']
30: 2    0
Name: Active, dtype: object
Run Code Online (Sandbox Code Playgroud)

鉴于该值明显为零且索引为2,我尝试了以下内容进行简单的健全性检查,发现事情并未发生,正如我可能预期的那样:

>>> if pnl[company]['Active'][2]==0:
...     print 'woo-hoo'
... else:
...     print 'doh'


doh
Run Code Online (Sandbox Code Playgroud)

我的问题是:

1)这里可能会发生什么?我怀疑我在一些基本层面上误解了词典.

2)我注意到,当我提出这个字典的任何给定值时,左边的数字增加1.这代表什么?例如:

>>> pnl[company].tail(1)['Active']
31: 2    0
Name: Active, dtype: object
>>> pnl[company].tail(1)['Active']
32: 2    0
Name: Active, dtype: object
>>> pnl[company].tail(1)['Active']
33: 2    0
Name: Active, dtype: object
>>> pnl[company].tail(1)['Active']
34: 2    0
Name: Active, dtype: object
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助.

EdC*_*ica 6

你得到的是一个Pandas Series对象,这不能以你尝试的方式进行评估,即使它只是你需要将你的行改为的单个值:

if pnl[company].tail(1)['Active'].any()==1:
  print 'yay'
Run Code Online (Sandbox Code Playgroud)

关于你的第二个问题,请参阅我的评论.

编辑

从注释和链接到您的输出,调用any()修复了错误消息,但您的数据实际上是字符串,因此比较仍然失败,您可以这样做:

if pnl[company].tail(1)['Active'].any()=='1':
  print 'yay'
Run Code Online (Sandbox Code Playgroud)

要进行字符串比较,或修复数据但是已经读取或生成了数据.

或者做:

pnl['Company']['Active'] = pnl['Company']['Active'].astype(int)
Run Code Online (Sandbox Code Playgroud)

要转换dtype列,以便您的比较更正确.