2014-08-29 2 views
1

다른 열의 부울 값을 기반으로 DataFrame에 새 열을 추가하려고합니다.다른 열의 부울 값을 기반으로 새 열 추가

이 같은 DataFrame을 감안할 때 :

snr = DataFrame({ 'name': ['A', 'B', 'C', 'D', 'E'], 'seniority': [False, False, False, True, False] }) 

는 지금까지 왔어요 먼은 이것이다 :

--------------------------------------------------------------------------- 
KeyError         Traceback (most recent call last) 
<ipython-input-208-0694ebf79a50> in <module>() 
     2  contact['refined_seniority'] = 'Senior' if contact['seniority'] else 'Non-Senior' 
     3 
----> 4 snr.apply(refine_seniority) 
     5 
     6 snr 

/usr/lib/python2.7/dist-packages/pandas/core/frame.pyc in apply(self, func, axis, broadcast, raw, args, **kwds) 
    4414      return self._apply_raw(f, axis) 
    4415     else: 
-> 4416      return self._apply_standard(f, axis) 
    4417    else: 
    4418     return self._apply_broadcast(f, axis) 

/usr/lib/python2.7/dist-packages/pandas/core/frame.pyc in _apply_standard(self, func, axis, ignore_failures) 
    4489      # no k defined yet 
    4490      pass 
-> 4491     raise e 
    4492 
    4493 

KeyError: ('seniority', u'occurred at index name') 

:

def refine_seniority(contact): 
    contact['refined_seniority'] = 'Senior' if contact['seniority'] else 'Non-Senior' 

snr.apply(refine_seniority) 

아직이 오류를 받고 있어요 DataFrames에 대한 근본적인 이해가 빠진 것처럼 느껴지지만 막혀 있습니다.

다른 열의 부울 값을 기반으로 새 열을 추가하는 적절한 방법은 무엇입니까?

답변

1

당신은 딕셔너리를 생성하고 map를 호출 할 수 있습니다하십시오 벡터화 솔루션을 적용 할 수있는 경우 @Jeff가 map 또는 apply를 사용하여 지적 사용자로서

In [176]: 

temp = {True:'senior', False:'Non-senior'} 
snr['refined_seniority'] = snr['seniority'].map(temp) 
snr 
Out[176]: 
    name seniority refined_seniority 
0 A  False  Non-senior 
1 B  False  Non-senior 
2 C  False  Non-senior 
3 D  True   senior 
4 E  False  Non-senior 

은 최후의 수단이어야한다.

또는 당신이 당신의 기능을 변형 한 경우 NumPy와 where

In [178]: 

snr['refined_seniority'] = np.where(snr['seniority'] == True, 'senior', 'Non-senior') 
snr 
Out[178]: 
    name seniority refined_seniority 
0 A  False  Non-senior 
1 B  False  Non-senior 
2 C  False  Non-senior 
3 D  True   senior 
4 E  False  Non-senior 

를 사용하여 다음 작업 것입니다 : 당신이 쓴 무엇

In [187]: 

def refine_seniority(contact): 
    if contact == True: 
     return 'senior' 
    else: 
     return 'Non-senior' 

snr['refined_seniority'] = snr['seniority'].apply(refine_seniority) 
snr 
Out[187]: 
    name seniority refined_seniority 
0 A  False  Non-senior 
1 B  False  Non-senior 
2 C  False  Non-senior 
3 D  True   senior 
4 E  False  Non-senior 

이 잘못, 당신은 안양하지만 열에 적용 호출 라벨이 존재하지 않으므로 아래 참조 :

In [193]: 

def refine_seniority(contact): 
    print(contact) 


snr['refined_seniority'] = snr.apply(refine_seniority) 

0 A 
1 B 
2 C 
3 D 
4 E 
Name: name, dtype: object 
0 False 
1 False 
2 False 
3  True 
4 False 
Name: seniority, dtype: object 

여기에서 볼 수 있습니다. 2 팬더 시리즈 출력, '연공 서열'에 대한 핵심 가치가 없기 때문에 오류가 발생합니다.

+0

이것은 단지의 간단한 응용 프로그램입니다. – Jeff

+0

@Jeff 어떻게 생겼습니까? – EdChum

+0

매우 유사 np.where soln – Jeff

관련 문제