2017-01-20 4 views
2

NB : 이와 비슷한 질문은 asked before이지만 정확히 내 질문에 대답하지 않습니다.팬더 - 여러 열로 선택

부울 조건을 만족하는 특정 수의 열을 기반으로 여러 열이있는 팬더 데이터 프레임을 어떻게 서브 세트화할 수 있습니까? 당신은 당신의 조건 중 하나 또는 다른 방법을 지정해야합니다

df[(df.column4 > a1) | (df.column23 < a2) | (df.column27 == a3) | ... 
    (df.column56 > a21) | (df.column72 < a22)] 

감사

+0

귀하의 조건에 일정한 규칙이 있습니까? – Lagerbaer

+0

@ Lagerbaer 아니.하지만 모든 조건이 '>'라고 가정합니다. 그 방법이 있습니까? 나는 람다 함수를 컬럼에 적용 할 수없고 필요한 행만 가져온다. – sntx

+0

튜플 (열 이름 및 조건) 목록이 있으면 해당 목록을 반복하고 필터 내에서 사용할 조건을 점진적으로 작성할 수 있습니다. – Lagerbaer

답변

0

:

는 바로 지금, 내가 좋아하는 뭔가를해야 할 것입니다. 당신은 결국 하나 하나에 감소 각 조건에 대한 개별 마스크 생성 할 수 있습니다 : 우리는 "손으로 만든"선택과 비교해 때

import seaborn.apionly as sns 
import operator 
import numpy as np 

# Load a sample dataframe to play with 
df = sns.load_dataset('iris') 

# Define individual conditions as tuples 
# ([column], [compare_function], [compare_value]) 
cond1 = ('sepal_length', operator.gt, 5) 
cond2 = ('sepal_width', operator.lt, 2) 
cond3 = ('species', operator.eq, 'virginica') 
conditions = [cond1, cond2, cond3] 

# Apply those conditions on the df, creating a list of 3 masks 
masks = [fn(df[var], val) for var, fn, val in conditions] 
# Reduce those 3 masks to one using logical OR 
mask = np.logical_or.reduce(masks) 

result = df.ix[mask] 

을, 우리는 그들이 동일한있어 참조 :

result_manual = df[(df.sepal_length>5) | (df.sepal_width<2) | (df.species == 'virginica')] 
result_manual.equals(result) # == True 
+1

나는이 대답에서 두 가지를 배웠다. reduce를 사용하여 가면을 만들었다. 왜 내가 그런 생각을하지 않았는지 모르겠다. 감사. – sntx