您好我有四列列名(ma5,ma10,ma20,ma60)。我想看看在每一行中,它是否满足:ma60> ma20> ma10> ma5(此特定行中这些列中的数字),如果为true则返回1,如果为false则返回0。所以我尝试了以下内容:
(eachstockdf['ma5']>eachstockdf['ma10'] and
eachstockdf['ma10']>eachstockdf['ma20'] and
eachstockdf['ma20']>eachstockdf['ma60']) *1
我希望它返回一个0和1的系列作为条件是否满足的指示。但它会出现以下错误:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(),
a.item(), a.any() or a.all().
我知道只比较两行时它才有用。例如:
((eachstockdf['ma5']>eachstockdf['ma10'])) *1
但是如何比较四列呢?在此先感谢!!
答案 0 :(得分:1)
你需要使用按位&
运算符,pandas会重载这些运算符。
此外,由于按位运算符的优先级,每个条件必须包含在另一组封闭的parens中。
( (eachstockdf['ma5'] > eachstockdf['ma10']) &
(eachstockdf['ma10'] > eachstockdf['ma20']) &
(eachstockdf['ma20'] > eachstockdf['ma60']) ) * 1
作为备注,您还可以使用
将bool
转换为int
(....).astype(int)
答案 1 :(得分:1)
如果您的数据框只包含四列ma5
,ma10
,ma20
和ma60
(或连续移动平均线的任意顺序),则可以比较每列的值以检查它们是否大于(gt
)左侧列的移位值(行的axis=1
)。这种比较的第一列总是无关紧要的,因为它的左边没有任何东西,所以通过iloc[:, 1:]
排除它,然后检查所有行值是否为真,以确保每行的MA单调递增。 / p>
您可以将布尔值转换为1
/ 0
的指标,只需将结果(.add(0)
)加零即可将结果强制转换为整数。或者,您可以使用.astype(int)
。
请注意,此方法比使用命名列进行比较更为通用,因为它允许任意数量的连续移动平均值具有任意窗口。
df = pd.DataFrame(np.random.randn(5, 4), columns=['ma5', 'ma10', 'ma20', 'ma60'])
df.gt(df.shift(axis=1), axis=1).iloc[:, 1:].all(axis=1).add(0)