【问题标题】:Pandas Series and the `in` operatorPandas 系列和 `in` 运算符
【发布时间】:2018-04-21 17:42:26
【问题描述】:

这似乎是一种奇怪且违反直觉的行为。谁能解释一下为什么会这样设计?

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

for n in lkup:
    print(n,' --> ',n in lkup)
>>>
Amy  -->  False
Fred  -->  False

为什么它给我 Values 而不是键?

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

我问的原因是,在将值从 DataFrame 映射到 Series 中的值时,这实际上弄乱了我的程序

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

这种矛盾逻辑的原因是什么?

【问题讨论】:

  • 对 Series 的迭代会遍历这些值。对 DataFrame 的迭代会遍历列名。
  • in的行为更加一致:item in series等价于item in series.indexitem in df等价于item in df.columns

标签: python pandas series


【解决方案1】:

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

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

我问的原因是,在将值从 DataFrame 映射到 Series 中的值时,这实际上弄乱了我的程序

您的映射关闭有两个原因,第一个是键区分大小写,因此'fred' 映射到 -> 'Fred',但 'Fred' -> NAN,因为系列中没有索引。 第二个,map 对整个 df 进行操作,因此如果您使用序列中缺少的键(例如 'john'),则映射将为 NAN。

但是当我这样做时

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

3 弗雷德

Pandas 数据框 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

【讨论】:

    猜你喜欢
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多