2013-08-29 9 views
3

가정하자 나는팬더 : 반복 필터 기능 DataFrame의 행

df[(df['a'] == 'x') & (df['c'] == 2)] 

, 그래서 같은 DataFrame,

df = pd.DataFrame([['x', 1, 2], ['x', 1, 3], ['y', 2, 2]], 
        columns=['a', 'b', 'c']) 

가, 내가 좋아하는 뭔가를 할 수 c == 2a == 'x' 모든 행을 선택하려면이 아니면 할 수 임시 변수를 만들어 반복적으로 수정,

df1 = df[df['a'] == 'x'] 
df2 = df1[df1['c'] == 2] 

행을 반복적으로 수정하는 방법은 무엇입니까? 이 지금은 해결책은 아니지만

(
    df 
    .refine(lambda row: row['a'] == 'x')  # this method doesn't exist 
    .refine(lambda row: row['c'] == 2) 
) 

답변

1

, 팬더 버전 0.13에서 당신은

df.query('a == "x"').query('c == 2') 

당신이 원하는 것을 달성 할 수 있습니다. 또한

df['a == "x"']['c == 2'] 

0.13까지

df[(df.a == 'x') & (df.c == 2)] 

잘못 무엇

df['a == "x" and c == 2'] 

을 할 수 있습니다

?

+0

@AndyHayden 아니, 내가 올바르게 이해하는 경우. chaining의 경우 chaining만큼'query'를 여러 번 호출 할 것입니다. 나는 체인을'']''에있는 표현식으로 "'''''''''''에 넣을 수있는 좋은 방법이 있다고 생각하지 않습니다. –

+1

그것은 단지 문체적인 취향입니다. 메서드 체인을 사용하면 코드가 명확 해집니다. pandas 0.13을 사용하면'DataFrame.query' 구문을 통해 개별 열에 대한 간단한 비교가 아닌 임의의 행 기능을 필터링 할 수 있습니까? – duckworthd

+0

아마도 그렇지 않습니다. 지금 함수 호출은 파서에서 구현되지 않습니다. 질의는 임의의 함수 호출을 지원하지 않는 numexpr을 사용하여 큰 배열 (> 10000 요소)에 대해 큰 속도 향상을 가져옵니다 (몇 가지 numpy 수학 함수와'where' IIRC를 지원합니다). 다른 백엔드는 임의의 callable을 지원할 수 있지만, 핵심'query' 코드가 병합되면이를 구현할 수는 있지만 스타일에 대한 가치는 거의 없습니다. 또는'DataFrame'에 대한 메소드를 추가하여 원하는 것을 할 수 있습니다 (체인 선택). 그러나 본질적으로 느린 것처럼 보입니다. –

0

많은 용어가있는 경우; 런타임까지 알 수없는 번호는 다음과 같이 할 수 있습니다. 나는이 목표를 달성하기 위해 모든 아름다운 방법에있다 말하고 있지 않다 그러나 나는 팬더 0.14.1와 대안 볼 수 없습니다 : 물론

df = pd.DataFrame([['x', 1, 2], ['x', 1, 3], ['y', 2, 2]], 
        columns=['a', 'b', 'c']) 

conditions = {'a': 'x', 'c': 2} 

def esc(term): 
    if isinstance(term, str): 
     return '"%s"' % term 
    return str(term) 

q_parts = ["%s == %s" % (k, esc(v)) for k, v in conditions.items()] 
q = ' and '.join(q_parts) 

print df.query(q) 

의 ESC 기능이나 넓은 조각이 될 필요를 논리적으로 처리 할 수 ​​있도록 확장 - NOT x, (x, y, z) 등 x ...