比较列中的值和返回布尔值

时间:2017-08-18 05:47:32

标签: python pandas dataframe

您好我有四列列名(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

但是如何比较四列呢?在此先感谢!!

2 个答案:

答案 0 :(得分:1)

你需要使用按位&运算符,pandas会重载这些运算符。

此外,由于按位运算符的优先级,每个条件必须包含在另一组封闭的parens中。

( (eachstockdf['ma5']  > eachstockdf['ma10']) & 
  (eachstockdf['ma10'] > eachstockdf['ma20']) & 
  (eachstockdf['ma20'] > eachstockdf['ma60'])  ) * 1

作为备注,您还可以使用

bool转换为int
(....).astype(int)

答案 1 :(得分:1)

如果您的数据框只包含四列ma5ma10ma20ma60(或连续移动平均线的任意顺序),则可以比较每列的值以检查它们是否大于(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)