如何检查系列的标志是否符合给定的标志?

时间:2014-10-11 07:22:35

标签: python pandas series

例如,我有一个如下的系列,

ts = pd.Series([-1,-2.4,5,6,7, -4, -8])

我想知道是否有pythonic方法可以检查ts符号列表中的符号,例如,

sign = '++++---' # returns False

,而

sign = '--+++--' # returns True

3 个答案:

答案 0 :(得分:1)

要检查系列元素是否为正,您可以创建一个布尔系列,如下所示:

>>> ts >= 0
0    False
1    False
2     True
3     True
4     True
5    False
6    False
dtype: bool

(我认为0是正面的,但如果您另有选择,可以采用这种技术。)

要将sign置于类似的布尔系列中,您可能需要将字符串'+'和' - '字符串解释为布尔值。例如:

>>> sign = '++++---'
>>> pd.Series(list(sign)).replace({'-': 0, '+': 1}).astype(bool)
0     True
1     True
2     True
3     True
4    False
5    False
6    False
dtype: bool

现在您可以比较两个系列并使用all。在一行中,整个事情看起来像这样:

>>> all((ts >= 0) == pd.Series(list('++++---')).replace({'-': 0, '+': 1}).astype(bool))
False

>>> all((ts >= 0) == pd.Series(list('--+++--')).replace({'-': 0, '+': 1}).astype(bool))
True

答案 1 :(得分:1)

此解决方案需要一些numpy功能,但由于您正在为您的数据系列使用pandas,这可能不是您的问题。

import pandas as pd
import numpy as np

values = pd.Series([-1, -2.4, 5, 6, 7, -4, -8, 0])
sign_str = "--+++--0"

sign_map = {
    "+" : 1,
    "0" : 0,
    "-" : -1
}

expected_signs = list(map(sign_map.get, sign_str))
observed_signs = np.sign(values)
np.all(expected_signs == observed_signs)

答案 2 :(得分:1)

这是另一种不需要任何字符串替换操作的方法:

import numpy as np
import pandas as pd

ts = pd.Series([-2, -4, -6, 5, 7, 9])
expected_signs = '---+++'

target_signs = np.array(list(expected_signs)) == '+'
actual_signs = ts.values > 0
match = np.all(target_signs == actual_signs)