2017-04-26 215 views
0

这是我想用来检查数据框的每一行是否遵循列值中的特定趋势的通用函数。if语句中的复合不等式

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) 

当我这样做,当有明确一些行应该返回False它返回所有True。我不确定我使用的不平等或功能本身是否有问题。

回答

1

化合物比较不“扩展出”的字典查找。 "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: 
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)) 

import pandas as pd 
df = pd.DataFrame({"A": [1,2], "B": [3,1], "C": [4,2]}) 
df 

# A B C 
#0 1 3 4 
#1 2 1 2 

df.diff(axis=1).drop('A', 1).gt(0).all(1) 

#0  True 
#1 False 
#dtype: bool 
0

你可以使用query为此。参见

 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 
例如低于

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. 

结果