我有一系列包含7个元素的列表(但可以是任何数字)。我试图找到所有正元素,所有负元素,以及在任意点改变符号的列表,
例如[3, 6, 7, -2, -5, -1, -1]
或[3, 1, -1, -2, -1, -5, -1]
。
请注意,虽然我在我的例子中使用了integers
,但lists
实际上是由floats
组成的。
我可以很容易地找到所有总是正或负的列表,但我如何找到那些改变符号的列表(它可以从正到负,如在示例中或从负到正)。
使用for循环从第0个元素迭代到倒数第二个元素,并比较符号或检查两个连续数字的乘积是否小于0。
如果是,则在列表中添加元素。
假设该系列为
0 [3, 6, 7, -2, -5, -1, -1]
1 [3, 1, -1, -2, -1, -5, -1]
dtype: object
你可以试着得到list in Series中每个元素的符号,并将它们相加。
- 如果结果为7,则表示全部为正,
- 如果结果为-7,表示全部为负
- 否则,可能会改变标志。(考虑到零)
m = s.apply(lambda lst: sum(map(np.sign, lst)))
print(m)
0 -1
1 -3
dtype: int64
考虑列表为零,可以加入符号列表,检查是否存在1,-1
或-1,1
n = s.apply(lambda lst: ','.join(map(str, map(np.sign, lst))))
n = n.str.contains('1,-1|-1,1')
print(n)
0 True
1 True
dtype: bool
如果不限制0位,可以直接检查符号列表
中是否有1
和-1
n = s.apply(lambda lst: {1, -1}.issubset(set(map(np.sign, lst))))
这样的东西可以在numpy中更好地实现,开销更少
x = np.array([[3, 6, 7, -2, -5, -1, -1],[3, 1, -1, -2, -1, -5, -1]])
allpositive = (x>0).all(axis=1)
allnegative = (x<0).all(axis=1)
mixed = ((x>0)|(x<0)).any(axis=1)
特定数据集的结果:
>>> x
array([[ 3, 6, 7, -2, -5, -1, -1],
[ 3, 1, -1, -2, -1, -5, -1]])
>>> allpositive
array([False, False])
>>> allnegative
array([False, False])
>>> mixed
array([ True, True])
根据您的喜好调整行为以覆盖0符号。