2017-11-08 16 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 

グレートシリーズ内の値へのデータフレームからマッピング値 - 期待されるようになったのは:

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演算子を値の上で反復処理するようにプログラムされていたため、表示目的でキーがシリーズインデックスと見なされるためです。

私が尋ねる理由は、これは実際にあなたのマッピングがオフになっている二つの理由、最初のものはありますシリーズ

の値にデータフレームからマッピング値ながら、私のプログラムをめちゃくちゃことが判明していることですキーは大文字と小文字が区別されるので、 'fred'は - > 'Fred'にマッピングされますが、 'Fred' - > NANはシリーズにインデックスがないためマップされます。 2番目のマップはdf全体で動作します。そのため、シリーズに欠けている 'john'などのキーを使用すると、マッピングはNANになります。

が、ときに私は

DF [df.name.isin( 'lkup')]。

3フレッド

パンダの名前を行いますデータフレーム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