if语句中的复合不等式

时间:2017-04-26 22:10:31

标签: python if-statement dataframe

这是一个通用函数,我想用它来检查数据帧的每一行是否遵循列值中的特定趋势。

def follows_trend(row):
    trend = None
    if row[("col_5" < "col_6" < "col_4" < "col_1" < "col_2" < "col_3")]:
        trend = True        
    else:
        trend = False
    return trend

我会像这样申请

df_trend = df.apply(follows_trend, axis=1)

当我这样做时,如果显然某些行应返回True,则返回所有False。我不确定我使用的不等式或函数本身是否有问题。

3 个答案:

答案 0 :(得分:1)

复合比较不会“扩展”dict查找。 "col_5" < "col_6" < "col_4" < "col_1" < "col_2" < "col_3"将首先进行评估,生成False,因为字符串未排序 - 因此您的if语句实际上是if row[(False)]:。你需要这样做:

if row["col_5"] < row["col_6"] < row["col_4"] < row["col_1"] < row["col_2"] < row["col_3"]:

如果你有很多这些表达式,你应该把它提取到一个方法,它带有row和一个列名列表,并使用一个循环进行比较。如果你只有一个,但想要一个更漂亮的版本,试试这个:

a, b, c, d, e, f = (row[c] for c in ("col_5", "col_6", "col_4", "col_1", "col_2", "col_3"))
if a < b < c < d < e < f:

答案 1 :(得分:0)

您也可以对列名重新排序,使用double rate=0.0; 函数检查行的差异,并将结果与​​diff进行比较:

0

实施例

(df[["col_5", "col_6", "col_4", "col_1", "col_2", "col_3"]]
   .diff(axis=1).drop('col_5', 1).gt(0).all(1))

答案 2 :(得分:0)

您可以使用query。见下面的例子

df = pd.DataFrame(np.random.randn(5, 3), columns=['col1','col2','col3'])
print df
print df.query('col2>col3>col1') # query can accept a string with multiple comparisons. 

结果

     col1      col2      col3
0 -0.788909  1.591521  1.709402
1 -1.563310  1.188993  2.295683
2 -1.572323 -0.600015 -1.518411
3  1.786051  0.303291 -0.344720
4  0.756029 -0.393941  1.059874
       col1      col2      col3
2 -1.572323 -0.600015 -1.518411