2017-04-26 9 views
0

これは、データフレームの各行が列の値の特定の傾向に従っているかどうかを確認するために使用する汎用関数です。 Falseを返す必要があり、いくつかの行が明らかに存在しているとき、私が行うと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) 

ようにそれを適用します、それはすべての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

あなたはを使用することができますこれはです。

 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. 

結果、以下の例を参照してください。