Pandas系列和`in`操作符

时间:2017-11-08 21:15:59

标签: python pandas series

这似乎是一种奇怪而反直觉的行为。任何人都可以解释为什么这样设计?

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 个答案:

答案 0 :(得分:0)

  

为什么它给我的是值而不是键?

因为它被编程为使in运算符迭代值,用于显示目的,因为你的键被认为是系列索引。

  

我问的原因是,这实际上是在将数据帧中的值映射到系列中的值时弄乱了我的程序

您的映射关闭有两个原因,第一个原因是密钥区分大小写,因此' fred'映射到 - > ' Fred',但' Fred' - > NAN因为系列中没有索引。 第二个,map在整个df上运行,所以如果你使用诸如' john'之类的密钥。系列中缺少的,映射将是NAN。

  

但是当我做的时候

     
    

DF [df.name.isin(' lkup&#39)]。名称

         
      

3弗雷德

    
  

Pandas数据框的功能与运营商中的python有很大不同。 它构建一个具有匹配值的矩阵。 由于你的价值观是从系列中收集的,所以他们是弗雷德'和艾米'因为迭代器返回的是值,而不是系列的索引。

来源: 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