例如,我有一个如下的系列,
ts = pd.Series([-1,-2.4,5,6,7, -4, -8])
我想知道是否有pythonic方法可以检查ts
符号列表中的符号,例如,
sign = '++++---' # returns False
,而
sign = '--+++--' # returns True
答案 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)