2016-08-04 4 views
1
df1 = pd.DataFrame({'A' : [5,5,5,5], 'B' : [4,2,1, 1], 'C' : [2,2,7,1]}) 

私はdl1をfollに基づいて取得したいと思います。条件:pandasデータフレームから一致する行を抽出するためのPython関数を書く

df1.loc[(df1['A'] == 5) & (df1['B'] == 4) & (df1['C'] == 2)] 

どのように私は、すなわち、それは、より汎用的にすることができ、私は列名と私は、引数として探しています両方の値を指定する機能を持っていると思います。

答えて

3

一つを割り当てますオプションはqueryを使用することです。あなたの質問には、'A==5 & B==4 & C==2'の行に沿って文字列を作成する必要があります。

問題をセットアップするために、('A', '==', 5)のように、条件として(column, comparison, value)の形式でタプルのリストを提供すると仮定します。あなたは等価比較のみを気にする場合は、'=='でちょうどハードコードはできる

def extract_matching_rows(df, conditions): 
    conditions = ' & '.join(['{}{}{}'.format(*c) for c in conditions]) 
    return df.query(conditions) 

とあなたの状態のタプルからそれを排除:

次に、あなたの線に沿って機能を記述することができます。わずかに異なる条件で

使用例:

conditions = [('A', '>=', 5), ('B', '==', 4), ('C', '<', 3)] 
extract_matching_rows(df1, conditions) 

    A B C 
0 5 4 2 

注意あなたもqueryで列を比較することができます

conditions = [('B', '>=', 'C'), ('A', '==', 5)] 
extract_matching_rows(df1, conditions) 

    A B C 
0 5 4 2 
1 5 2 2 
3 5 1 1 
+0

ありがとう@root、あなたの解決策は数​​字の代わりに働いていますか、文字列の比較がありますか? – user308827

+1

はい、非常に簡単な方法ではありません。クエリ文字列内に引用符を付ける必要があります。 '' A == "yes"&B == 4 "です。これを実現するには、文字列内に引用符が必要です。つまり、文字列を定義する一重引用符で囲まれた二重引用符、つまりその逆も必要です。 '( 'A'、 '=='、 'yes' ')'。 – root

+1

また、関数内でチェックを実装して、文字列と比較しているかどうかを判断し、そうであればクエリのフォーマットを少し違うようにすることもできます: ''{} {}' {} '' format(* c)' 。 – root

1

あなたはこのような何かを必要とする、filterdfはあなたの関数である:

import pandas as pd 

df1 = pd.DataFrame({'A' : [5,5,5,5], 'B' : [4,2,1,1], 'C' : [2,2,7,1]}) 

def filterdf(df,col1,col2,val1,val2): 
    return df[(df[col1] == val1) & (df[col2] == val2)] 

df2 = filterdf(df1,'A','B',5,4) 
print(df2) 
Out: 
    A B C 
0 5 4 2 
+0

は私は問題がdownvoting前にあるものを教えてください!! –

+0

@GuaravDhama私は問題を見ることができません。その下の投票は、私の意見では保証されていませんでした。私の+1。 – piRSquared

2

あなたはシリーズ

# first row of df1 
looking_for = df1.iloc[0, :] 

に探しているものを次に平等を評価し、すべてがに等しい場所を見つけるの割り当て行。

df1.eq(looking_for).all(1) 

0  True 
1 False 
2 False 
3 False 
dtype: bool 

フィルタ

df1[df1.eq(looking_for).all(1)] 

enter image description here

総称して使用し、これを、任意の一連

looking_for = pd.Series([1, 5, 7], list('BAC')) 

df1[df1.eq(looking_for).all(1)] 

enter image description here

関連する問題