2013-02-12 7 views
3

df이 팬더 DataFrame 개체라고 가정합니다.기준별로 항목을 삭제하는 방법은 무엇입니까?

어떻게에만 None, 빈 문자열 또는 공백 전용 문자열을 포함 df의 모든 열을 삭제합니까?

하락에 대한 기준은 다음과 같은 테스트 기능에 공급 될 때 모든 값이 True을 산출하는 컬럼으로 표현 될 수있다 : 나는 주로 아래 알아 냈있어 한

lambda x: (x is None) or not re.match('\S', str(x)) 
+0

는이 열을 통해 루프 옵션이 될 및 검사에 해당하는 경우 드롭 것인가? – herrfz

답변

1

,하지만 난 ' 아직 파이썬에서 RegEx에 익숙하지 않다. 이것은 기본적인 방법입니다 내가 걸릴 것 :

더미 데이터 :

In [3]: df.apply(lambda x: x.isin([None,""," "])) 
Out[3]: 
     a  b  c 
0 True True False 
1 False True False 
2 False False False 
3 False True False 
4 False False False 

이 사실에 대해 테스트하는 any() 메소드를 호출 :

In [1]: df 
Out[1]: 
     a b c 
0 None  1 
1  b  2 
2  c x 3 
3  d  4 
4  e z 5 

In [2]: df.to_dict() 
Out[2]: 
{'a': {0: None, 1: 'b', 2: 'c', 3: 'd', 4: 'e'}, 
'b': {0: ' ', 1: ' ', 2: 'x', 3: ' ', 4: 'z'}, 
'c': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5}} 

는 드롭 할 조건 람다 시험 적용 모든 df 열에서

In [4]: df.apply(lambda x: x.isin([None,""," "])).any() 
Out[4]: 
a  True 
b  True 
c False 

색인 df.columns with t

In [5]: drop_cols = df.columns[df.apply(lambda x: x.isin([None,""," "])).any()] 

In [6]: drop_cols 
Out[6]: Index([a, b], dtype=object) 

가 df.drop() 메소드를 사용하고 열을 작동 할 수있는 축 = 1 옵션을 통과 : 이제

In [7]: df.drop(drop_cols, axis=1) 
Out[7]: 
    c 
0 1 
1 2 
2 3 
3 4 
4 5 

을 그는 당신이 드롭 할 열을 얻을 위에서 시리즈를 부울 Pandas/RegEx 경험이 많은 사람이 그 조각을 알아낼 수 있다면, 괜찮은 해결책이 있다고 말하고 싶습니다.

+0

사실 나는 OP의 질문이 **'모든 것 '** **'모든 것'**보다는 **을 원한다고 생각합니다. ** :) 이것은 거의'df.apply (all)'... [정규 표현식을 배우는 것이 틀림 없습니다.] (http://xkcd.com/208/) 재미 있기 때문에 재미 있습니다. –

3

당신은 DataFrame의 요소에 함수를 적용 할 applymap를 사용할 수 있습니다

In [19]: df = pd.DataFrame({'a': [None] * 4, 'b': list('abc') + [' '], 
          'c': [None] + list('bcd'), 'd': range(7, 11), 
          'e': [' '] * 4}) 

In [20]: df 
Out[20]: 
     a b  c d e 
0 None a None 7 
1 None b  b 8 
2 None c  c 9 
3 None  d 10 

In [21]: to_drop = df.applymap(
        lambda x: (x is None) or not re.match('\S', str(x))).all() 

In [22]: df.drop(df.columns[to_drop], axis=1) 
Out[22]: 
    b  c d 
0 a None 7 
1 b  b 8 
2 c  c 9 
3  d 10 
+0

'apply.md'는 나를 위해 작동하는're.match' 함수를 얻는 열쇠였습니다. 단지'apply'를 사용할 때 실패했습니다 – Zelazny7

+1

사실 OP의 질문은 **'any' **가 아니라 **'all' **을 원합니다. :) –

+0

@AndyHayden ok 나는 당신이 옳다고 생각한다. 나는 대답을 업데이트 할 것이다. 감사 – bmu

관련 문제