这是一个通用函数,我想用它来检查数据帧的每一行是否遵循列值中的特定趋势。
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
。我不确定我使用的不等式或函数本身是否有问题。
答案 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