2017-11-08 1 views
1

이것은 이상하고 반 직관적 인 행동처럼 보입니다. 누구나 이것이 왜 이렇게 설계되었는지 설명 할 수 있습니까?팬더 시리즈와`in` 연산자

lkup = pd.Series({'fred':'Fred','amy':'Amy'}) 

for n in lkup: 
    print(n,' --> ',n in lkup) 
>>> 
Amy --> False 
Fred --> False 
왜 나에게 대신의 열쇠를주고있다

?

'fred' in lkup, 'amy' in lkup 
>>>> True, True 

물어 그 이유는이 실제로 내 프로그램을 엉망으로 밝혀졌다 있다는 것입니다 동안

df = pd.DataFrame([['fred',1,2,3],['amy',3,4,5],['john',5,6,7],['Fred',11,12,33]], columns=['name','c1','c2','c3']) 

df 
>>> 
    name c1 c2 c3 
0 fred 1 2 3 
1 amy  3 4 5 
2 john 5 6 7 
3 Fred 11 12 33 


df.name.map(lkup) 
>>> 
0 Fred 
1  Amy 
2  NaN 
3  NaN 

큰 일련의 값에 DataFrame에서 매핑 값 - 예상대로 가입일 :

lkup.to_dict() 
>>> {'amy': 'Amy', 'fred': 'Fred'} 

하지만 난

df[df.name.isin('lkup')].name 
>>> 3 Fred 
을 수행 할 때

DataFrames를 사용할 때이 문제가 발생하지 않습니다.

for n in df: 
    print(n,' --> ',n in df) 
>>> 
name --> True 
c1 --> True 
c2 --> True 
c3 --> True 

이 모순 된 논리에 대한 이유는 무엇입니까?

+1

반복은 값을 통해 반복합니다. DataFrame에 대한 반복은 열 이름을 반복합니다. – unutbu

+1

'in'의 동작은보다 일관성이 있습니다 :'item in series'는'item in series.index'와 같고'df'의 item은'df.columns'의 item과 같습니다. – unutbu

답변

0

왜 키 대신 값을 제공합니까?

in 연산자가 값을 반복하여 표시하기 위해 프로그래밍 되었기 때문에 키가 일련의 인덱스로 간주되기 때문입니다.

물어 그 이유는이 실제로 밝혀졌다 일련의 값에 DataFrame에서 매핑 값이

두 가지 이유는, 첫 번째가 당신의 매핑이 꺼져있는 동안 내 프로그램을 엉망으로 할 수 있다는 것입니다 키가 대소 문자를 구분하므로 시리즈에 색인이 없기 때문에 'Fred'는 -> 'Fred'로 매핑되지만 'Fred'-> NAN으로 매핑됩니다. 둘째, 맵은 전체 df에서 작동하므로 계열에서 누락 된 'john'과 같은 키를 사용하면 매핑이 NAN이됩니다.

하지만 난

3 프레드

팬더의 이름을

DF [df.name.isin ('lkup를')]. 할 때 데이터 프레임 isin 함수는 python의 in 연산자와 완전히 다르게 작동합니다. 일치하는 값을 가진 행렬을 만듭니다. 값은 계열에서 모아 졌기 때문에 반복자는 계열의 인덱스가 아닌 값을 반환하므로 'Fred'와 'Amy'입니다.

출처 : 시리즈를 통해 http://pandas.pydata.org/pandas-docs/stable/dsintro.html#series

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.html#pandas.DataFrame

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.isin.html