熊猫:在`where`中使用两个系列的“和”

时间:2013-08-12 17:31:23

标签: python pandas

我编写了一个小函数来获取系列的日志返回值:

def get_log_returns(series):
    logs = numpy.log(series.astype('float64') / series.astype('float64').shift(1))
    return logs 

现在我想确保我只包含“合理”的日志。我知道我可以使用where来排除无穷大的日志:

def get_log_returns(series):
    logs = numpy.log(series.astype('float64') / series.astype('float64').shift(1))
    return logs.where(logs < numpy.inf)

但如果在顶部我想排除负面的日志呢?我希望像这样的东西能起作用:

def get_log_returns(series):
    logs = numpy.log(series.astype('float64') / series.astype('float64').shift(1))
    return logs.where((logs < numpy.inf) and (logs > 0))

但这给了我一个

ValueError: The truth value of an array with more than one element is ambiguous.
 Use a.any() or a.all()

任何想法如何做到这一点?

2 个答案:

答案 0 :(得分:3)

您应该使用&运算符。

logs[(logs < numpy.inf) & (logs > 0)]
布尔系列不支持

andor操作,因此您必须使用&|运算符。

答案 1 :(得分:1)

在pandas 0.13中,您将能够执行以下操作:

logs[pd.eval('0 < logs < inf')]

它提供了比当前内置Python语法更好的语法,并且对于非常大的Series,奖励可以快5倍。使用DataFrame s的好处甚至更大,因为您实际上可以将查询传递给框架的[]“方法”,就像这样

df['a < b < c']

假设DataFrame dfabc

请注意,您无法使用and的原因是因为Python,而不是numpypandasHere's the PEP。您将看到状态为“已拒绝”。假设不会实施此PEP可能是安全的。

还有a video here在某些时候他们会谈论这个问题。