2015-01-30 4 views
0

저는 Python을 처음 접했고 이것이 처음으로 질문이었습니다.다른 열의 NaN을 기반으로하는 Python 새 열

다른 유사한 질문에 대한 답변을 시도했지만 여전히 상당히 혼란 스럽습니다.

나는 팬더를 이용하고 있고 여러 개의 서로 다른 SQL 테이블에서 병합과 같은 것을 보이는 dataframe 있습니다

Col_1 Col_2 Col_3 Col_4 
1  NaN  NaN  NaN 
2  Y  NaN  NaN 
3  Z  C  S 
4  NaN  B  W 

내가 col_2에는 col_3이와 Col_4의 값에 대해 걱정하지 않는다 (참고

Col_1 Col_2 Col_3 Col_4 Col_5 
1  NaN  NaN  NaN  0 
2  Y  NaN  NaN  1 
3  Z  C  S  1 
4  NaN  B  W  1 
:이 난 그냥이 열 중 하나 이상이 같은 다섯 번째 열을 원하는 이상적으로 채워지고 신경

컬럼에 따라 문자열이나 정수 또는 객체) 될 수 있습니다 0

그런 다음 Col_2 열을 Col_4로 놓을 것입니다.

초기 생각은 아래 함수와 비슷하지만 데이터 프레임이 50000 행에서 50 행으로 줄었습니다. 행을 삭제하고 싶지 않습니다.

def function(row): 
    if (isnull.row['col_2'] and isnull.row['col_3'] and isnull.row['col_3'] is None): 
     return '0' 
    else: 
     return '1' 

df['col_5'] = df.apply(lambda row: function (row),axis=1) 

모든 도움을 주시면 감사하겠습니다.

+0

팬더 데이터 프레임을 사용하고 있습니다. 질문에'pandas' 태그를 추가했습니다. 일반적으로 Python 표준 라이브러리의 일부가 아닌 타사 라이브러리 (예 : 판다)를 사용하고 있는지 언급해야합니다. – BrenBarn

+0

감사합니다. 또한 질문을 업데이트하겠습니다. – coghmeister

답변

3

사용 any 및 행이 많다는이 01False 값으로 모든 True 값을 변환합니다 int로 변환 부울 배열을 생성합니다 테스트 PARAM axis=1을 통과,이 훨씬 빠르게 apply를 호출하는 것보다 될 것이다을 것입니다 행 방향으로 반복하고 매우 느려질 수 :

In [34]: 

any(df[df.columns[1:]].notnull(), axis=1) 
Out[34]: 
array([False, True, True, True], dtype=bool) 
: 여기
In [30]: 

df['Col_5'] = any(df[df.columns[1:]].notnull(), axis=1).astype(int) 
df 
Out[30]: 
    Col_1 Col_2 Col_3 Col_4 Col_5 
0  1 NaN NaN NaN  0 
1  2  Y NaN NaN  1 
2  3  Z  C  S  1 
3  4 NaN  B  W  1 

In [31]: 

df = df[['Col_1', 'Col_5']] 
df 
Out[31]: 
    Col_1 Col_5 
0  1  0 
1  2  1 
2  3  1 
3  4  1 

any의 출력입니다

타이밍 df 명령 내 방법은 빨리 다른 응답에 비해 2 배 이상이 크기에 대한 테스트 데이터에 따라서

In [35]: 

%timeit df[df.columns[1:]].apply(lambda x: all(x.isnull()) , axis=1).astype(int) 
%timeit any(df[df.columns[1:]].notnull(), axis=1).astype(int) 
100 loops, best of 3: 2.46 ms per loop 
1000 loops, best of 3: 1.4 ms per loop 

업데이트는 팬더 버전 0.12.0을 실행으로

최상위 레벨 notnull을 호출해야합니다. 해당 메소드는 df 레벨에서 사용할 수 없으므로

any(pd.notnull(df[df.columns[1:]]), axis=1).astype(int) 

많은 기능과 버그 수정이 추가되면서 업그레이드하시기 바랍니다.

+0

OP가 행 및 열 쌍에 대해 'OR'연산을 원하고 구현이 'AND'연산 인 것으로 생각합니다. OP는 열 2-4에 NaN이 아닌 값이 적어도 하나라도 있으면 'col5'를 true로 만들고 싶습니다. –

+0

실제로 @aus_lacy @aus_lacy 실제로는 그냥 반전해야합니다. 또는 – EdChum

+0

구현과 함께'any()'와'~'를 사용해 보았는데 작동하지 못해서 관심을 가질 것입니다. 반전을 봐라. –

0

기능을 사용하여 내 돈을 위해

df['col_5'] =df.apply(lambda x: all(x.isnull()) , axis=1) 

읽기 조금 더 쉽습니다. 어느 것이 더 빠르는지 확실하지 않습니다.

관련 문제