跨越Pandas中多个行和列的布尔运算

时间:2017-08-25 08:42:23

标签: python pandas

我正在对两列中的True值运行测试,而前两行 - 基本上如果任一列为true或前两个值if应返回true。

我想出了这个,有效:

Data['BS Buy Flag']=((Data['DivDown']==True) | (Data['DivDown'].shift(1)==True) | (Data['DivDown'].shift(2)==True) | (Data['KelknerDown']==True) | (Data['KelknerDown'].shift(1)==True) | (Data['KelknerDown'].shift(2)==True))

但它非常不合理 - 必须有更好的方法来做到这一点......

1 个答案:

答案 0 :(得分:0)

可能不值得(计算/内存方面),但如果你的代码伤害了你的骄傲并让你夜不能寐,你可以试试这个:

df_list = [Data['DivDown'], 
           Data['DivDown'].shift(1), 
           Data['DivDown'].shift(2), 
           Data['KelknerDown'], 
           Data['KelknerDown'].shift(1), 
           Data['KelknerDown'].shift(2)]

# Create a new df using df_list, preserving index
check_df = reduce(lambda x, y, pd.merge(x.to_frame(), y.to_frame(), left_index=True, right_index=True), df_list)

# Write over check_df with result
check_df = check_df.any(axis=1)    # Returns True if any value in a row is True

# Merge check_df to original data
Data = pd.merge(check_df.to_frame(), Data, left_index=True, right_index=True, how='inner')

您现在应该在Data中有一个可以检查的附加列。就像我说的那样,除非你拥有非常庞大的数据集,否则它可能效率不高,或者你需要跟踪的条件非常多。

如果需要,您还可以存储其他分析的条件(特征选择,聚类等)