2016-08-16 3 views
1

マスクを関数の引数として使用したいと思います。何が動作します:関数の引数としてpandasデータフレームにマスクを提供する

a)は、よりエレガントな解決策があるかどう

data = pd.DataFrame([[50, 100, 1], [0, 2, 1]], columns=['a', 'b', 'c']) 

# the function argument 
kwargs = {'a': 0, 'b': 2, 'c':1} 

# generate a list of the elements 
temp = [] 
for item in kwargs.items(): 
    temp.append('(data.{}'.format(item[0]) + ' == {})'.format(item[1])) 
temp 

# generate mask as string 
mask = ' & '.join(elem for elem in temp) 

# apply mask 
data[eval(mask)] 

私は不思議でしたか?

b)èval(mask)は、データフレームのサイズが大きくなると問題を引き起こす可能性がありますか?

答えて

1

次のように動作するはずです。ジェネレータの理解を使用

data[pd.DataFrame(data[k] == v for k, v in kwargs.items()).all()] 

、それはdata値がkwargs値と同等であるか否かのためbool複数のデータフレームを作成します。このデータフレームで.all()を呼び出し、それをマスクとして使用します。

evalほとんどのコードで使用することを強くお勧めします。ほとんどの場合、より良い解決策が常にあります。たとえば、eval(mask)は、data.column_name(名前が有効でない場合、x yなど)で列にアクセスできない場合に問題を引き起こします。

関連する問題